forked from TrueCloudLab/frostfs-node
[#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:
parent
165a600624
commit
25d5995cef
2 changed files with 18 additions and 9 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue