You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.5 KiB

/**
* @file
* @copyright defined in aergo/LICENSE.txt
*/
package trie
import (
"sync"
"github.com/p4u/asmt/db"
)
// DbTx represents Set and Delete interface to store data
type DbTx interface {
Set(key, value []byte)
Delete(key []byte)
}
type CacheDB struct {
// liveCache contains the first levels of the trie (nodes that have 2 non default children)
liveCache map[Hash][][]byte
// liveMux is a lock for liveCache
liveMux sync.RWMutex
// updatedNodes that have will be flushed to disk
updatedNodes map[Hash][][]byte
// updatedMux is a lock for updatedNodes
updatedMux sync.RWMutex
// nodesToRevert will be deleted from db
nodesToRevert [][]byte
// revertMux is a lock for updatedNodes
revertMux sync.RWMutex
// lock for CacheDB
lock sync.RWMutex
// store is the interface to disk db
Store db.DB
}
// commit adds updatedNodes to the given database transaction.
func (c *CacheDB) commit(txn *DbTx) {
c.updatedMux.Lock()
defer c.updatedMux.Unlock()
for key, batch := range c.updatedNodes {
var node []byte
(*txn).Set(append(node, key[:]...), c.serializeBatch(batch))
}
}
// serializeBatch serialises the 2D [][]byte into a []byte for db
func (c *CacheDB) serializeBatch(batch [][]byte) []byte {
serialized := make([]byte, 4) //, 30*33)
if batch[0][0] == 1 {
// the batch node is a shortcut
bitSet(serialized, 31)
}
for i := 1; i < 31; i++ {
if len(batch[i]) != 0 {
bitSet(serialized, i-1)
serialized = append(serialized, batch[i]...)
}
}
return serialized
}