From 2cb7ec963396fe2837cf7c520c1548904b8bdbee Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Tue, 17 Jan 2023 18:48:16 +0300 Subject: [PATCH] [#2200] shard: Fix blobstor obj fetching In the previous implementation any non-nil error that preceded object fetching from blobstor led to iterating over every storage (in other words, no storage ID information was taken into account). Now storage ID is skipped only if metabase (storage ID source) returns any error. Signed-off-by: Pavel Karpy Signed-off-by: Evgenii Stratonikov --- CHANGELOG.md | 1 + pkg/local_object_storage/shard/get.go | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ea8b3df0..2c4108975 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Changelog for FrostFS Node ### Fixed - Big object removal with non-local parts (#1978) - Disable pilorama when moving to degraded mode (#2197) +- Fetching blobovnicza objects that not found in write-cache (#2206) - Correct status error for expired session token (#2207) ### Removed diff --git a/pkg/local_object_storage/shard/get.go b/pkg/local_object_storage/shard/get.go index c728dc1d2..a5da288f9 100644 --- a/pkg/local_object_storage/shard/get.go +++ b/pkg/local_object_storage/shard/get.go @@ -94,8 +94,8 @@ func (s *Shard) Get(prm GetPrm) (GetRes, error) { // fetchObjectData looks through writeCache and blobStor to find object. func (s *Shard) fetchObjectData(addr oid.Address, skipMeta bool, cb storFetcher, wc func(w writecache.Cache) (*objectSDK.Object, error)) (*objectSDK.Object, bool, error) { var ( - err error - res *objectSDK.Object + mErr error + mRes meta.ExistsRes ) var exists bool @@ -103,15 +103,15 @@ func (s *Shard) fetchObjectData(addr oid.Address, skipMeta bool, cb storFetcher, var mPrm meta.ExistsPrm mPrm.SetAddress(addr) - mRes, err := s.metaBase.Exists(mPrm) - if err != nil && !s.info.Mode.NoMetabase() { - return res, false, err + mRes, mErr = s.metaBase.Exists(mPrm) + if mErr != nil && !s.info.Mode.NoMetabase() { + return nil, false, mErr } exists = mRes.Exists() } if s.hasWriteCache() { - res, err = wc(s.writeCache) + res, err := wc(s.writeCache) if err == nil || IsErrOutOfRange(err) { return res, false, err } @@ -123,8 +123,8 @@ func (s *Shard) fetchObjectData(addr oid.Address, skipMeta bool, cb storFetcher, } } - if skipMeta || err != nil { - res, err = cb(s.blobStor, nil) + if skipMeta || mErr != nil { + res, err := cb(s.blobStor, nil) return res, false, err } @@ -135,12 +135,12 @@ func (s *Shard) fetchObjectData(addr oid.Address, skipMeta bool, cb storFetcher, var mPrm meta.StorageIDPrm mPrm.SetAddress(addr) - mRes, err := s.metaBase.StorageID(mPrm) + mExRes, err := s.metaBase.StorageID(mPrm) if err != nil { return nil, true, fmt.Errorf("can't fetch blobovnicza id from metabase: %w", err) } - res, err = cb(s.blobStor, mRes.StorageID()) + res, err := cb(s.blobStor, mExRes.StorageID()) return res, true, err }