From 3f4717a37fbb27ba59cc63065a83bfc18eac7a8b Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Thu, 20 Mar 2025 16:35:01 +0300 Subject: [PATCH] [#1692] metabase: Do not allocate map in cache unless needed Change-Id: I8b1015a8c7c3df4153a08fdb788117d9f0d6c333 Signed-off-by: Evgenii Stratonikov --- .../metabase/bucket_cache.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/pkg/local_object_storage/metabase/bucket_cache.go b/pkg/local_object_storage/metabase/bucket_cache.go index 69553d55c..de1479e6f 100644 --- a/pkg/local_object_storage/metabase/bucket_cache.go +++ b/pkg/local_object_storage/metabase/bucket_cache.go @@ -14,10 +14,7 @@ type bucketCache struct { } func newBucketCache() *bucketCache { - return &bucketCache{ - expired: make(map[cid.ID]*bbolt.Bucket), - primary: make(map[cid.ID]*bbolt.Bucket), - } + return &bucketCache{} } func getLockedBucket(bc *bucketCache, tx *bbolt.Tx) *bbolt.Bucket { @@ -56,7 +53,7 @@ func getExpiredBucket(bc *bucketCache, tx *bbolt.Tx, cnr cid.ID) *bbolt.Bucket { bucketName = objectToExpirationEpochBucketName(cnr, bucketName) return tx.Bucket(bucketName) } - return getMappedBucket(bc.expired, tx, objectToExpirationEpochBucketName, cnr) + return getMappedBucket(&bc.expired, tx, objectToExpirationEpochBucketName, cnr) } func getPrimaryBucket(bc *bucketCache, tx *bbolt.Tx, cnr cid.ID) *bbolt.Bucket { @@ -65,17 +62,21 @@ func getPrimaryBucket(bc *bucketCache, tx *bbolt.Tx, cnr cid.ID) *bbolt.Bucket { bucketName = primaryBucketName(cnr, bucketName) return tx.Bucket(bucketName) } - return getMappedBucket(bc.primary, tx, primaryBucketName, cnr) + return getMappedBucket(&bc.primary, tx, primaryBucketName, cnr) } -func getMappedBucket(m map[cid.ID]*bbolt.Bucket, tx *bbolt.Tx, nameFunc func(cid.ID, []byte) []byte, cnr cid.ID) *bbolt.Bucket { - value, ok := m[cnr] +func getMappedBucket(m *map[cid.ID]*bbolt.Bucket, tx *bbolt.Tx, nameFunc func(cid.ID, []byte) []byte, cnr cid.ID) *bbolt.Bucket { + value, ok := (*m)[cnr] if ok { return value } + if *m == nil { + *m = make(map[cid.ID]*bbolt.Bucket, 1) + } + bucketName := make([]byte, bucketKeySize) bucketName = nameFunc(cnr, bucketName) - m[cnr] = getBucket(&value, tx, bucketName) + (*m)[cnr] = getBucket(&value, tx, bucketName) return value }