package meta import ( "go.etcd.io/bbolt" ) type bucketCache struct { locked *bbolt.Bucket graveyard *bbolt.Bucket garbage *bbolt.Bucket } func newBucketCache() *bucketCache { return &bucketCache{} } func lockedBucket(bc *bucketCache, tx *bbolt.Tx) *bbolt.Bucket { if bc == nil { return tx.Bucket(bucketNameLocked) } return getBucket(&bc.locked, tx, bucketNameLocked) } func graveyardBucket(bc *bucketCache, tx *bbolt.Tx) *bbolt.Bucket { if bc == nil { return tx.Bucket(graveyardBucketName) } return getBucket(&bc.graveyard, tx, graveyardBucketName) } func garbageBucket(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 }