From 25d5995cef58e37b7dbf3310fb535f23b39cf013 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Wed, 18 Jan 2023 09:38:42 +0300 Subject: [PATCH] [#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 --- pkg/local_object_storage/pilorama/batch.go | 3 ++- pkg/local_object_storage/pilorama/boltdb.go | 24 ++++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/pkg/local_object_storage/pilorama/batch.go b/pkg/local_object_storage/pilorama/batch.go index c4c3574ba..30f14ffd4 100644 --- a/pkg/local_object_storage/pilorama/batch.go +++ b/pkg/local_object_storage/pilorama/batch.go @@ -34,8 +34,9 @@ func (b *batch) run() { sort.Slice(b.operations, func(i, j int) bool { 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 { - bLog, bTree, err := b.forest.getTreeBuckets(tx, b.cid, b.treeID) + bLog, bTree, err := b.forest.getTreeBuckets(tx, fullID) if err != nil { return err } diff --git a/pkg/local_object_storage/pilorama/boltdb.go b/pkg/local_object_storage/pilorama/boltdb.go index 42401e4d8..f2eda28de 100644 --- a/pkg/local_object_storage/pilorama/boltdb.go +++ b/pkg/local_object_storage/pilorama/boltdb.go @@ -157,8 +157,9 @@ func (t *boltForest) TreeMove(d CIDDescriptor, treeID string, m *Move) (*LogMove } lm := *m + fullID := bucketName(d.CID, treeID) 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 { return err } @@ -212,8 +213,9 @@ func (t *boltForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string, var lm []LogMove var key [17]byte + fullID := bucketName(d.CID, treeID) 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 { return err } @@ -320,8 +322,9 @@ func (t *boltForest) TreeApply(d CIDDescriptor, treeID string, m *Move, backgrou } if t.db.MaxBatchSize == 1 { + fullID := bucketName(d.CID, treeID) 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 { return err } @@ -379,8 +382,7 @@ func (t *boltForest) addBatch(d CIDDescriptor, treeID string, m *Move, ch chan e t.mtx.Unlock() } -func (t *boltForest) getTreeBuckets(tx *bbolt.Tx, cid cidSDK.ID, treeID string) (*bbolt.Bucket, *bbolt.Bucket, error) { - treeRoot := bucketName(cid, treeID) +func (t *boltForest) getTreeBuckets(tx *bbolt.Tx, treeRoot []byte) (*bbolt.Bucket, *bbolt.Bucket, error) { child := tx.Bucket(treeRoot) if child != 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 - cidRaw := []byte(cid.EncodeToString()) + cidRaw := make([]byte, 32) + cid.Encode(cidRaw) + cidLen := len(cidRaw) 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 { if treeID == "" { 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() { err := tx.DeleteBucket(k) if err != nil { @@ -855,7 +860,10 @@ func (t *boltForest) logToBytes(lm *LogMove) []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.