From 532c41ca0551d09493f41ced6f7cd8b25aceb452 Mon Sep 17 00:00:00 2001 From: Pavel Karpy Date: Mon, 12 Sep 2022 20:35:44 +0300 Subject: [PATCH] [#1658] meta: Do not check object expiration in counters Do not perform operations that produce unused results in `syncCounter`. Signed-off-by: Pavel Karpy --- pkg/local_object_storage/metabase/control.go | 8 ++------ pkg/local_object_storage/metabase/counter.go | 9 +++++++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pkg/local_object_storage/metabase/control.go b/pkg/local_object_storage/metabase/control.go index 6ae69586..25cd5ae6 100644 --- a/pkg/local_object_storage/metabase/control.go +++ b/pkg/local_object_storage/metabase/control.go @@ -83,8 +83,6 @@ func (db *DB) init(reset bool) error { string(shardInfoBucket): {}, } - epoch := db.epochState.CurrentEpoch() - return db.boltDB.Update(func(tx *bbolt.Tx) error { var err error if !reset { @@ -108,7 +106,7 @@ func (db *DB) init(reset bool) error { } if !reset { - err = syncCounter(tx, epoch, false) + err = syncCounter(tx, false) if err != nil { return fmt.Errorf("could not sync object counter: %w", err) } @@ -132,10 +130,8 @@ func (db *DB) init(reset bool) error { // SyncCounters forces to synchronize the object counters. func (db *DB) SyncCounters() error { - epoch := db.epochState.CurrentEpoch() - return db.boltDB.Update(func(tx *bbolt.Tx) error { - return syncCounter(tx, epoch, true) + return syncCounter(tx, true) }) } diff --git a/pkg/local_object_storage/metabase/counter.go b/pkg/local_object_storage/metabase/counter.go index dbb72380..0ab1d980 100644 --- a/pkg/local_object_storage/metabase/counter.go +++ b/pkg/local_object_storage/metabase/counter.go @@ -108,7 +108,7 @@ func (db *DB) updateCounter(tx *bbolt.Tx, typ objectType, delta uint64, inc bool // // Does nothing if counters are not empty and force is false. If force is // true, updates the counters anyway. -func syncCounter(tx *bbolt.Tx, epoch uint64, force bool) error { +func syncCounter(tx *bbolt.Tx, force bool) error { b, err := tx.CreateBucketIfNotExists(shardInfoBucket) if err != nil { return fmt.Errorf("could not get shard info bucket: %w", err) @@ -123,13 +123,18 @@ func syncCounter(tx *bbolt.Tx, epoch uint64, force bool) error { var phyCounter uint64 var logicCounter uint64 + graveyardBKT := tx.Bucket(graveyardBucketName) + garbageBKT := tx.Bucket(garbageBucketName) + err = iteratePhyObjects(tx, func(cnr cid.ID, obj oid.ID) error { phyCounter++ addr.SetContainer(cnr) addr.SetObject(obj) - if st := objectStatus(tx, addr, epoch); st == 0 || st == 3 { + // check if an object is available: not with GCMark + // and not covered with a tombstone + if inGraveyardWithKey(addressKey(addr), graveyardBKT, garbageBKT) == 0 { logicCounter++ }