diff --git a/CHANGELOG.md b/CHANGELOG.md index d56477ee23..fb0b23582f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Changelog for NeoFS Node ### Fixed - Resending the header after chunks have already been sent in object service `Get` handler (#3833) +- GC deadlock on local object storage shutdown (#3837) ### Changed diff --git a/pkg/local_object_storage/engine/get.go b/pkg/local_object_storage/engine/get.go index 5737642fdf..0312a314c9 100644 --- a/pkg/local_object_storage/engine/get.go +++ b/pkg/local_object_storage/engine/get.go @@ -37,7 +37,11 @@ func (e *StorageEngine) Get(addr oid.Address) (*object.Object, error) { if e.blockErr != nil { return nil, e.blockErr } + return e.getInt(addr) +} +// getInt is an unlocked version of Get. +func (e *StorageEngine) getInt(addr oid.Address) (*object.Object, error) { var ( err error obj *object.Object diff --git a/pkg/local_object_storage/engine/inhume.go b/pkg/local_object_storage/engine/inhume.go index cc0ba9ce48..cb459d71a2 100644 --- a/pkg/local_object_storage/engine/inhume.go +++ b/pkg/local_object_storage/engine/inhume.go @@ -96,7 +96,7 @@ func (e *StorageEngine) processAddrDelete(addr oid.Address, deleteFunc func(*sha linkAddr.SetContainer(addr.Container()) linkAddr.SetObject(linkID) - linkObj, err := e.Get(linkAddr) + linkObj, err := e.getInt(linkAddr) if err != nil { e.log.Debug("inhuming root object but no link object is found", zap.Stringer("linkAddr", linkAddr),