forked from TrueCloudLab/frostfs-node
[#2213] node: Do not return object expired object
"Object is expired" means that object is presented in `meta` but it is not `ObjectNotFound` error. Previous implementation made `shard` search for an object without `meta` which was an error. Signed-off-by: Pavel Karpy <p.karpy@yadro.com>
This commit is contained in:
parent
ad93d4db7c
commit
40822adb51
2 changed files with 7 additions and 1 deletions
|
@ -27,6 +27,7 @@ Changelog for FrostFS Node
|
|||
- Fix `dirty` suffix in debian package version (#53)
|
||||
- Prevent node process from killing by systemd when shutting down (#1465)
|
||||
- Restore subscriptions correctly on morph client switch (#2212)
|
||||
- Expired objects could be returned if not marked with GC yet (#2213)
|
||||
|
||||
### Removed
|
||||
### Updated
|
||||
|
|
|
@ -74,6 +74,7 @@ func (e *StorageEngine) get(prm GetPrm) (GetRes, error) {
|
|||
shPrm.SetAddress(prm.addr)
|
||||
|
||||
var hasDegraded bool
|
||||
var objectExpired bool
|
||||
|
||||
e.iterateOverSortedShards(prm.addr, func(_ int, sh hashedShard) (stop bool) {
|
||||
noMeta := sh.GetMode().NoMetabase()
|
||||
|
@ -113,7 +114,7 @@ func (e *StorageEngine) get(prm GetPrm) (GetRes, error) {
|
|||
case shard.IsErrObjectExpired(err):
|
||||
// object is found but should not
|
||||
// be returned
|
||||
outError = errNotFound
|
||||
objectExpired = true
|
||||
return true
|
||||
default:
|
||||
e.reportShardError(sh, "could not get object from shard", err)
|
||||
|
@ -130,6 +131,10 @@ func (e *StorageEngine) get(prm GetPrm) (GetRes, error) {
|
|||
return GetRes{}, logicerr.Wrap(objectSDK.NewSplitInfoError(outSI))
|
||||
}
|
||||
|
||||
if objectExpired {
|
||||
return GetRes{}, errNotFound
|
||||
}
|
||||
|
||||
if obj == nil {
|
||||
if !hasDegraded && shardWithMeta.Shard == nil || !shard.IsErrNotFound(outError) {
|
||||
return GetRes{}, outError
|
||||
|
|
Loading…
Reference in a new issue