forked from TrueCloudLab/frostfs-node
If context has already been canceled, then there is no need to check other shards. At the same time, it is necessary to avoid handling context cancellation in each handler. Therefore, the context check has been moved to the shard iteration method, which now returns an error. Change-Id: I70030ace36593ce7d2b8376bee39fe82e9dbf88f Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package engine
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
|
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
|
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// exists return in the first value true if object exists.
|
|
// Second return value marks is parent object locked.
|
|
func (e *StorageEngine) exists(ctx context.Context, shPrm shard.ExistsPrm) (bool, bool, error) {
|
|
alreadyRemoved := false
|
|
exists := false
|
|
locked := false
|
|
|
|
if err := e.iterateOverSortedShards(ctx, shPrm.Address, func(_ int, sh hashedShard) (stop bool) {
|
|
res, err := sh.Exists(ctx, shPrm)
|
|
if err != nil {
|
|
if client.IsErrObjectAlreadyRemoved(err) {
|
|
alreadyRemoved = true
|
|
|
|
return true
|
|
}
|
|
|
|
var siErr *objectSDK.SplitInfoError
|
|
if errors.As(err, &siErr) {
|
|
return true
|
|
}
|
|
|
|
if shard.IsErrObjectExpired(err) {
|
|
return true
|
|
}
|
|
|
|
if !client.IsErrObjectNotFound(err) {
|
|
e.reportShardError(ctx, sh, "could not check existence of object in shard", err, zap.Stringer("address", shPrm.Address))
|
|
}
|
|
return false
|
|
}
|
|
|
|
if !exists {
|
|
exists = res.Exists()
|
|
}
|
|
if !locked {
|
|
locked = res.Locked()
|
|
}
|
|
|
|
return false
|
|
}); err != nil {
|
|
return false, false, err
|
|
}
|
|
|
|
if alreadyRemoved {
|
|
return false, false, new(apistatus.ObjectAlreadyRemoved)
|
|
}
|
|
|
|
return exists, locked, nil
|
|
}
|