forked from TrueCloudLab/frostfs-node
[#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 <a.savchuk@yadro.com>
This commit is contained in:
parent
6ccac0a476
commit
2dc934839a
1 changed files with 8 additions and 1 deletions
|
@ -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() {
|
||||
|
|
Loading…
Add table
Reference in a new issue