diff --git a/pkg/local_object_storage/metabase/counter.go b/pkg/local_object_storage/metabase/counter.go index 915fbd957..ee1ab41de 100644 --- a/pkg/local_object_storage/metabase/counter.go +++ b/pkg/local_object_storage/metabase/counter.go @@ -346,7 +346,7 @@ func (db *DB) incContainerObjectCounter(tx *bbolt.Tx, cnrID cid.ID, isUserObject // Does nothing if counters are not empty and force is false. If force is // true, updates the counters anyway. func syncCounter(tx *bbolt.Tx, force bool) error { - shardInfoB, err := tx.CreateBucketIfNotExists(shardInfoBucket) + shardInfoB, err := createBucketLikelyExists(tx, shardInfoBucket) if err != nil { return fmt.Errorf("could not get shard info bucket: %w", err) } @@ -359,7 +359,7 @@ func syncCounter(tx *bbolt.Tx, force bool) error { return nil } - containerCounterB, err := tx.CreateBucketIfNotExists(containerCounterBucketName) + containerCounterB, err := createBucketLikelyExists(tx, containerCounterBucketName) if err != nil { return fmt.Errorf("could not get container counter bucket: %w", err) } diff --git a/pkg/local_object_storage/metabase/put.go b/pkg/local_object_storage/metabase/put.go index 1f0022389..5d8e4d263 100644 --- a/pkg/local_object_storage/metabase/put.go +++ b/pkg/local_object_storage/metabase/put.go @@ -356,8 +356,21 @@ func updateFKBTIndexes(tx *bbolt.Tx, obj *objectSDK.Object, f updateIndexItemFun return nil } +type bucketContainer interface { + Bucket([]byte) *bbolt.Bucket + CreateBucket([]byte) (*bbolt.Bucket, error) + CreateBucketIfNotExists([]byte) (*bbolt.Bucket, error) +} + +func createBucketLikelyExists[T bucketContainer](tx T, name []byte) (*bbolt.Bucket, error) { + if bkt := tx.Bucket(name); bkt != nil { + return bkt, nil + } + return tx.CreateBucket(name) +} + func putUniqueIndexItem(tx *bbolt.Tx, item namedBucketItem) error { - bkt, err := tx.CreateBucketIfNotExists(item.name) + bkt, err := createBucketLikelyExists(tx, item.name) if err != nil { return fmt.Errorf("can't create index %v: %w", item.name, err) } @@ -366,12 +379,12 @@ func putUniqueIndexItem(tx *bbolt.Tx, item namedBucketItem) error { } func putFKBTIndexItem(tx *bbolt.Tx, item namedBucketItem) error { - bkt, err := tx.CreateBucketIfNotExists(item.name) + bkt, err := createBucketLikelyExists(tx, item.name) if err != nil { return fmt.Errorf("can't create index %v: %w", item.name, err) } - fkbtRoot, err := bkt.CreateBucketIfNotExists(item.key) + fkbtRoot, err := createBucketLikelyExists(bkt, item.key) if err != nil { return fmt.Errorf("can't create fake bucket tree index %v: %w", item.key, err) } @@ -380,7 +393,7 @@ func putFKBTIndexItem(tx *bbolt.Tx, item namedBucketItem) error { } func putListIndexItem(tx *bbolt.Tx, item namedBucketItem) error { - bkt, err := tx.CreateBucketIfNotExists(item.name) + bkt, err := createBucketLikelyExists(tx, item.name) if err != nil { return fmt.Errorf("can't create index %v: %w", item.name, err) } @@ -474,7 +487,7 @@ func getVarUint(data []byte) (uint64, int, error) { // storage location to another. func updateStorageID(tx *bbolt.Tx, addr oid.Address, id []byte) error { key := make([]byte, bucketKeySize) - bkt, err := tx.CreateBucketIfNotExists(smallBucketName(addr.Container(), key)) + bkt, err := createBucketLikelyExists(tx, smallBucketName(addr.Container(), key)) if err != nil { return err }