Some checks failed
Build / Build Components (push) Has been cancelled
OCI image / Build container images (push) Has been cancelled
Pre-commit hooks / Pre-commit (push) Has been cancelled
Tests and linters / Lint (push) Has been cancelled
Tests and linters / Tests (push) Has been cancelled
Tests and linters / Tests with -race (push) Has been cancelled
Tests and linters / Staticcheck (push) Has been cancelled
Tests and linters / gopls check (push) Has been cancelled
Tests and linters / Run gofumpt (push) Has been cancelled
Vulncheck / Vulncheck (push) Successful in 1m32s
``` goos: linux goarch: amd64 pkg: git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase cpu: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz │ expired │ primary │ │ sec/op │ sec/op vs base │ Select/string_equal-8 3.529m ± 11% 3.689m ± 7% +4.55% (p=0.023 n=10) Select/string_not_equal-8 3.440m ± 7% 3.543m ± 13% ~ (p=0.190 n=10) Select/common_prefix-8 3.240m ± 6% 3.050m ± 5% -5.85% (p=0.005 n=10) Select/unknown-8 3.198m ± 6% 2.928m ± 8% -8.44% (p=0.003 n=10) geomean 3.349m 3.287m -1.84% │ expired │ primary │ │ B/op │ B/op vs base │ Select/string_equal-8 1.885Mi ± 0% 1.786Mi ± 0% -5.23% (p=0.000 n=10) Select/string_not_equal-8 1.885Mi ± 0% 1.786Mi ± 0% -5.23% (p=0.000 n=10) Select/common_prefix-8 1.885Mi ± 0% 1.786Mi ± 0% -5.23% (p=0.000 n=10) Select/unknown-8 1.877Mi ± 0% 1.779Mi ± 0% -5.26% (p=0.000 n=10) geomean 1.883Mi 1.784Mi -5.24% │ expired │ primary │ │ allocs/op │ allocs/op vs base │ Select/string_equal-8 46.04k ± 0% 43.04k ± 0% -6.50% (p=0.000 n=10) Select/string_not_equal-8 46.04k ± 0% 43.04k ± 0% -6.50% (p=0.000 n=10) Select/common_prefix-8 46.04k ± 0% 43.04k ± 0% -6.50% (p=0.000 n=10) Select/unknown-8 45.05k ± 0% 42.05k ± 0% -6.65% (p=0.000 n=10) geomean 45.79k 42.79k -6.54% ``` Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
81 lines
2 KiB
Go
81 lines
2 KiB
Go
package meta
|
|
|
|
import (
|
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
|
"go.etcd.io/bbolt"
|
|
)
|
|
|
|
type bucketCache struct {
|
|
locked *bbolt.Bucket
|
|
graveyard *bbolt.Bucket
|
|
garbage *bbolt.Bucket
|
|
expired map[cid.ID]*bbolt.Bucket
|
|
primary map[cid.ID]*bbolt.Bucket
|
|
}
|
|
|
|
func newBucketCache() *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 {
|
|
if bc == nil {
|
|
return tx.Bucket(bucketNameLocked)
|
|
}
|
|
return getBucket(&bc.locked, tx, bucketNameLocked)
|
|
}
|
|
|
|
func getGraveyardBucket(bc *bucketCache, tx *bbolt.Tx) *bbolt.Bucket {
|
|
if bc == nil {
|
|
return tx.Bucket(graveyardBucketName)
|
|
}
|
|
return getBucket(&bc.graveyard, tx, graveyardBucketName)
|
|
}
|
|
|
|
func getGarbageBucket(bc *bucketCache, tx *bbolt.Tx) *bbolt.Bucket {
|
|
if bc == nil {
|
|
return tx.Bucket(garbageBucketName)
|
|
}
|
|
return getBucket(&bc.garbage, tx, garbageBucketName)
|
|
}
|
|
|
|
func getBucket(cache **bbolt.Bucket, tx *bbolt.Tx, name []byte) *bbolt.Bucket {
|
|
if *cache != nil {
|
|
return *cache
|
|
}
|
|
|
|
*cache = tx.Bucket(name)
|
|
return *cache
|
|
}
|
|
|
|
func getExpiredBucket(bc *bucketCache, tx *bbolt.Tx, cnr cid.ID) *bbolt.Bucket {
|
|
if bc == nil {
|
|
bucketName := make([]byte, bucketKeySize)
|
|
bucketName = objectToExpirationEpochBucketName(cnr, bucketName)
|
|
return tx.Bucket(bucketName)
|
|
}
|
|
return getMappedBucket(bc.expired, tx, objectToExpirationEpochBucketName, cnr)
|
|
}
|
|
|
|
func getPrimaryBucket(bc *bucketCache, tx *bbolt.Tx, cnr cid.ID) *bbolt.Bucket {
|
|
if bc == nil {
|
|
bucketName := make([]byte, bucketKeySize)
|
|
bucketName = primaryBucketName(cnr, bucketName)
|
|
return tx.Bucket(bucketName)
|
|
}
|
|
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]
|
|
if ok {
|
|
return value
|
|
}
|
|
|
|
bucketName := make([]byte, bucketKeySize)
|
|
bucketName = nameFunc(cnr, bucketName)
|
|
m[cnr] = getBucket(&value, tx, bucketName)
|
|
return value
|
|
}
|