From dbbbef9ddb5904dc3e63069206dbd1f205c62cf2 Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Tue, 7 Feb 2023 15:08:22 +0300 Subject: [PATCH] [#2244] node: Update expired storage ID by WC Previously, node could get an "infinite" small object: it could be expired and thus could not be flushed (update its storage ID) to metabase => could not be marked as flushed => node never removes such object and repeat all the cycle one more time. If object exists and is not marked with GC (meta returns `ErrObjectIsExpired`, not `ObjectNotFound` and not `ObjectAlreadyRemoved`), its ID is safe to update _in the same_ bbolt transaction. Signed-off-by: Pavel Karpy --- CHANGELOG.md | 1 + pkg/local_object_storage/metabase/storage_id.go | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa9faa9b0..bb8ad51d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ Changelog for FrostFS Node - `neofs-adm morph dump-hashes` now properly iterates over custom domain (#2224) - Possible deadlock in write-cache (#2239) - Fix `*_req_count` and `*_req_count_success` metric values (#2241) +- Storage ID update by write-cache (#2244) ### Removed ### Updated diff --git a/pkg/local_object_storage/metabase/storage_id.go b/pkg/local_object_storage/metabase/storage_id.go index 4369215ae..4cda0b256 100644 --- a/pkg/local_object_storage/metabase/storage_id.go +++ b/pkg/local_object_storage/metabase/storage_id.go @@ -1,6 +1,8 @@ package meta import ( + "errors" + oid "github.com/TrueCloudLab/frostfs-sdk-go/object/id" "github.com/nspcc-dev/neo-go/pkg/util/slice" "go.etcd.io/bbolt" @@ -94,10 +96,11 @@ func (db *DB) UpdateStorageID(prm UpdateStorageIDPrm) (res UpdateStorageIDRes, e err = db.boltDB.Batch(func(tx *bbolt.Tx) error { exists, err := db.exists(tx, prm.addr, currEpoch) - if !exists || err != nil { - return err + if err == nil && exists || errors.Is(err, ErrObjectIsExpired) { + err = updateStorageID(tx, prm.addr, prm.id) } - return updateStorageID(tx, prm.addr, prm.id) + + return err }) return