[#1692] metabase: Do not allocate map in cache unless needed
All checks were successful
Vulncheck / Vulncheck (push) Successful in 1m5s
Pre-commit hooks / Pre-commit (push) Successful in 1m31s
Build / Build Components (push) Successful in 2m4s
Tests and linters / gopls check (push) Successful in 3m59s
OCI image / Build container images (push) Successful in 5m24s
Tests and linters / Run gofumpt (push) Successful in 6m12s
Tests and linters / Tests with -race (push) Successful in 6m41s
Tests and linters / Staticcheck (push) Successful in 6m49s
Tests and linters / Lint (push) Successful in 7m9s
Tests and linters / Tests (push) Successful in 7m7s

Change-Id: I8b1015a8c7c3df4153a08fdb788117d9f0d6c333
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
Evgenii Stratonikov 2025-03-20 16:35:01 +03:00
parent 60cea8c714
commit 3f4717a37f

View file

@ -14,10 +14,7 @@ type bucketCache struct {
} }
func newBucketCache() *bucketCache { func newBucketCache() *bucketCache {
return &bucketCache{ return &bucketCache{}
expired: make(map[cid.ID]*bbolt.Bucket),
primary: make(map[cid.ID]*bbolt.Bucket),
}
} }
func getLockedBucket(bc *bucketCache, tx *bbolt.Tx) *bbolt.Bucket { 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) bucketName = objectToExpirationEpochBucketName(cnr, bucketName)
return tx.Bucket(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 { 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) bucketName = primaryBucketName(cnr, bucketName)
return tx.Bucket(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 { 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] value, ok := (*m)[cnr]
if ok { if ok {
return value return value
} }
if *m == nil {
*m = make(map[cid.ID]*bbolt.Bucket, 1)
}
bucketName := make([]byte, bucketKeySize) bucketName := make([]byte, bucketKeySize)
bucketName = nameFunc(cnr, bucketName) bucketName = nameFunc(cnr, bucketName)
m[cnr] = getBucket(&value, tx, bucketName) (*m)[cnr] = getBucket(&value, tx, bucketName)
return value return value
} }