[#2210] pilorama: Allocate bucket name outside of batches

1. Reduce allocations inside transactions.
2. Do not encode container ID to string: it allocates a lot and takes more
space.

Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
Evgenii Stratonikov 2023-01-18 09:38:42 +03:00 committed by fyrchik
parent 165a600624
commit 25d5995cef
2 changed files with 18 additions and 9 deletions

View file

@ -34,8 +34,9 @@ func (b *batch) run() {
sort.Slice(b.operations, func(i, j int) bool { sort.Slice(b.operations, func(i, j int) bool {
return b.operations[i].Time < b.operations[j].Time return b.operations[i].Time < b.operations[j].Time
}) })
fullID := bucketName(b.cid, b.treeID)
err := b.forest.db.Update(func(tx *bbolt.Tx) error { err := b.forest.db.Update(func(tx *bbolt.Tx) error {
bLog, bTree, err := b.forest.getTreeBuckets(tx, b.cid, b.treeID) bLog, bTree, err := b.forest.getTreeBuckets(tx, fullID)
if err != nil { if err != nil {
return err return err
} }

View file

@ -157,8 +157,9 @@ func (t *boltForest) TreeMove(d CIDDescriptor, treeID string, m *Move) (*LogMove
} }
lm := *m lm := *m
fullID := bucketName(d.CID, treeID)
return &lm, t.db.Batch(func(tx *bbolt.Tx) error { return &lm, t.db.Batch(func(tx *bbolt.Tx) error {
bLog, bTree, err := t.getTreeBuckets(tx, d.CID, treeID) bLog, bTree, err := t.getTreeBuckets(tx, fullID)
if err != nil { if err != nil {
return err return err
} }
@ -212,8 +213,9 @@ func (t *boltForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string,
var lm []LogMove var lm []LogMove
var key [17]byte var key [17]byte
fullID := bucketName(d.CID, treeID)
err := t.db.Batch(func(tx *bbolt.Tx) error { err := t.db.Batch(func(tx *bbolt.Tx) error {
bLog, bTree, err := t.getTreeBuckets(tx, d.CID, treeID) bLog, bTree, err := t.getTreeBuckets(tx, fullID)
if err != nil { if err != nil {
return err return err
} }
@ -320,8 +322,9 @@ func (t *boltForest) TreeApply(d CIDDescriptor, treeID string, m *Move, backgrou
} }
if t.db.MaxBatchSize == 1 { if t.db.MaxBatchSize == 1 {
fullID := bucketName(d.CID, treeID)
return t.db.Update(func(tx *bbolt.Tx) error { return t.db.Update(func(tx *bbolt.Tx) error {
bLog, bTree, err := t.getTreeBuckets(tx, d.CID, treeID) bLog, bTree, err := t.getTreeBuckets(tx, fullID)
if err != nil { if err != nil {
return err return err
} }
@ -379,8 +382,7 @@ func (t *boltForest) addBatch(d CIDDescriptor, treeID string, m *Move, ch chan e
t.mtx.Unlock() t.mtx.Unlock()
} }
func (t *boltForest) getTreeBuckets(tx *bbolt.Tx, cid cidSDK.ID, treeID string) (*bbolt.Bucket, *bbolt.Bucket, error) { func (t *boltForest) getTreeBuckets(tx *bbolt.Tx, treeRoot []byte) (*bbolt.Bucket, *bbolt.Bucket, error) {
treeRoot := bucketName(cid, treeID)
child := tx.Bucket(treeRoot) child := tx.Bucket(treeRoot)
if child != nil { if child != nil {
return child.Bucket(logBucket), child.Bucket(dataBucket), nil return child.Bucket(logBucket), child.Bucket(dataBucket), nil
@ -716,7 +718,9 @@ func (t *boltForest) TreeList(cid cidSDK.ID) ([]string, error) {
} }
var ids []string var ids []string
cidRaw := []byte(cid.EncodeToString()) cidRaw := make([]byte, 32)
cid.Encode(cidRaw)
cidLen := len(cidRaw) cidLen := len(cidRaw)
err := t.db.View(func(tx *bbolt.Tx) error { err := t.db.View(func(tx *bbolt.Tx) error {
@ -782,7 +786,8 @@ func (t *boltForest) TreeDrop(cid cidSDK.ID, treeID string) error {
return t.db.Batch(func(tx *bbolt.Tx) error { return t.db.Batch(func(tx *bbolt.Tx) error {
if treeID == "" { if treeID == "" {
c := tx.Cursor() c := tx.Cursor()
prefix := []byte(cid.EncodeToString()) prefix := make([]byte, 32)
cid.Encode(prefix)
for k, _ := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, _ = c.Next() { for k, _ := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, _ = c.Next() {
err := tx.DeleteBucket(k) err := tx.DeleteBucket(k)
if err != nil { if err != nil {
@ -855,7 +860,10 @@ func (t *boltForest) logToBytes(lm *LogMove) []byte {
} }
func bucketName(cid cidSDK.ID, treeID string) []byte { func bucketName(cid cidSDK.ID, treeID string) []byte {
return []byte(cid.String() + treeID) treeRoot := make([]byte, 32+len(treeID))
cid.Encode(treeRoot)
copy(treeRoot[32:], treeID)
return treeRoot
} }
// 'o' + time -> old meta. // 'o' + time -> old meta.