From 2dc934839a4d8b0f548054102849b05ea4261d72 Mon Sep 17 00:00:00 2001 From: Aleksey Savchuk Date: Mon, 7 Oct 2024 15:33:54 +0300 Subject: [PATCH] [#1403] engine: Iterate all shards while seaching for an object Before, when searching for an object, we iterated over shards and stopped right after we found the object. Currently, we need to iterate over all shards, because, when the object and its GC mark are stored separately, we could find the object earlier than its GC mark. Signed-off-by: Aleksey Savchuk --- pkg/local_object_storage/engine/get.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/local_object_storage/engine/get.go b/pkg/local_object_storage/engine/get.go index 4a9199be7..9c00a0b68 100644 --- a/pkg/local_object_storage/engine/get.go +++ b/pkg/local_object_storage/engine/get.go @@ -94,6 +94,10 @@ func (e *StorageEngine) get(ctx context.Context, prm GetPrm) (GetRes, error) { return GetRes{}, errNotFound } + if client.IsErrObjectAlreadyRemoved(it.OutError) { + return GetRes{}, it.OutError + } + if it.Object == nil { if !it.HasDegraded && it.ShardWithMeta.Shard == nil || !client.IsErrObjectNotFound(it.OutError) { return GetRes{}, it.OutError @@ -146,7 +150,10 @@ func (i *getShardIterator) tryGetWithMeta(ctx context.Context) { res, err := sh.Get(ctx, i.ShardPrm) if err == nil { i.Object = res.Object() - return true + // Keep iterating over shards because the object's GC mark can be + // stored on another shard. For more information, please refer to + // https://git.frostfs.info/TrueCloudLab/frostfs-node/pulls/1403. + return false } if res.HasMeta() {