From 21717262ec66cb2da29474a65fde19d2b69aeaf2 Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Tue, 20 Dec 2022 16:27:03 +0300 Subject: [PATCH] [#2016] shard: Check meta first on `Get` `meta` should prevent returning removed objects (`GCMark` and `TS` relations are `meta` abstractions). Signed-off-by: Pavel Karpy --- CHANGELOG.md | 1 + pkg/local_object_storage/shard/get.go | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bee2e25b6..07732cc550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ Changelog for NeoFS Node - Prevent leaking goroutines in the tree service (#2162) - Do not search for LOCK objects when delete container when session provided (#2152) - Race conditions on shard's mode switch (#1956) +- Returning expired/removed objects from write-cache (#2016) ### Removed - `-g` option from `neofs-cli control ...` and `neofs-cli container create` commands (#2089) diff --git a/pkg/local_object_storage/shard/get.go b/pkg/local_object_storage/shard/get.go index 0ff846e99f..c728dc1d25 100644 --- a/pkg/local_object_storage/shard/get.go +++ b/pkg/local_object_storage/shard/get.go @@ -98,19 +98,6 @@ func (s *Shard) fetchObjectData(addr oid.Address, skipMeta bool, cb storFetcher, res *objectSDK.Object ) - if s.hasWriteCache() { - res, err := wc(s.writeCache) - if err == nil || IsErrOutOfRange(err) { - return res, false, err - } - - if IsErrNotFound(err) { - s.log.Debug("object is missing in write-cache") - } else { - s.log.Error("failed to fetch object from write-cache", zap.Error(err)) - } - } - var exists bool if !skipMeta { var mPrm meta.ExistsPrm @@ -123,6 +110,19 @@ func (s *Shard) fetchObjectData(addr oid.Address, skipMeta bool, cb storFetcher, exists = mRes.Exists() } + if s.hasWriteCache() { + res, err = wc(s.writeCache) + if err == nil || IsErrOutOfRange(err) { + return res, false, err + } + + if IsErrNotFound(err) { + s.log.Debug("object is missing in write-cache") + } else { + s.log.Error("failed to fetch object from write-cache", zap.Error(err)) + } + } + if skipMeta || err != nil { res, err = cb(s.blobStor, nil) return res, false, err