forked from cerc-io/plugeth
Added dirty tracking on the cache
This commit is contained in:
parent
7264044122
commit
e4a6ee3d7f
@ -20,8 +20,9 @@ func (n *Node) Copy() *Node {
|
||||
}
|
||||
|
||||
type Cache struct {
|
||||
nodes map[string]*Node
|
||||
db Database
|
||||
nodes map[string]*Node
|
||||
db Database
|
||||
IsDirty bool
|
||||
}
|
||||
|
||||
func NewCache(db Database) *Cache {
|
||||
@ -36,6 +37,7 @@ func (cache *Cache) Put(v interface{}) interface{} {
|
||||
sha := Sha3Bin(enc)
|
||||
|
||||
cache.nodes[string(sha)] = NewNode(sha, value, true)
|
||||
cache.IsDirty = true
|
||||
|
||||
return sha
|
||||
}
|
||||
@ -60,12 +62,18 @@ func (cache *Cache) Get(key []byte) *Value {
|
||||
}
|
||||
|
||||
func (cache *Cache) Commit() {
|
||||
// Don't try to commit if it isn't dirty
|
||||
if !cache.IsDirty {
|
||||
return
|
||||
}
|
||||
|
||||
for key, node := range cache.nodes {
|
||||
if node.Dirty {
|
||||
cache.db.Put([]byte(key), node.Value.Encode())
|
||||
node.Dirty = false
|
||||
}
|
||||
}
|
||||
cache.IsDirty = false
|
||||
|
||||
// If the nodes grows beyond the 200 entries we simple empty it
|
||||
// FIXME come up with something better
|
||||
@ -80,6 +88,7 @@ func (cache *Cache) Undo() {
|
||||
delete(cache.nodes, key)
|
||||
}
|
||||
}
|
||||
cache.IsDirty = false
|
||||
}
|
||||
|
||||
// A (modified) Radix Trie implementation. The Trie implements
|
||||
@ -103,6 +112,10 @@ func (t *Trie) Sync() {
|
||||
t.cache.Commit()
|
||||
}
|
||||
|
||||
func (t *Trie) Undo() {
|
||||
t.cache.Undo()
|
||||
}
|
||||
|
||||
/*
|
||||
* Public (query) interface functions
|
||||
*/
|
||||
|
@ -45,6 +45,26 @@ func TestTrieSync(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestTrieDirtyTracking(t *testing.T) {
|
||||
_, trie := New()
|
||||
trie.Update("dog", LONG_WORD)
|
||||
if !trie.cache.IsDirty {
|
||||
t.Error("Expected trie to be dirty")
|
||||
}
|
||||
|
||||
trie.Sync()
|
||||
if trie.cache.IsDirty {
|
||||
t.Error("Expected trie not to be dirty")
|
||||
}
|
||||
|
||||
trie.Update("test", LONG_WORD)
|
||||
trie.cache.Undo()
|
||||
if trie.cache.IsDirty {
|
||||
t.Error("Expected trie not to be dirty")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestTrieReset(t *testing.T) {
|
||||
_, trie := New()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user