Added dirty tracking on the cache

This commit is contained in:
obscuren 2014-02-16 20:32:56 +01:00
parent 7264044122
commit e4a6ee3d7f
2 changed files with 35 additions and 2 deletions

View File

@ -22,6 +22,7 @@ func (n *Node) Copy() *Node {
type Cache struct { type Cache struct {
nodes map[string]*Node nodes map[string]*Node
db Database db Database
IsDirty bool
} }
func NewCache(db Database) *Cache { func NewCache(db Database) *Cache {
@ -36,6 +37,7 @@ func (cache *Cache) Put(v interface{}) interface{} {
sha := Sha3Bin(enc) sha := Sha3Bin(enc)
cache.nodes[string(sha)] = NewNode(sha, value, true) cache.nodes[string(sha)] = NewNode(sha, value, true)
cache.IsDirty = true
return sha return sha
} }
@ -60,12 +62,18 @@ func (cache *Cache) Get(key []byte) *Value {
} }
func (cache *Cache) Commit() { func (cache *Cache) Commit() {
// Don't try to commit if it isn't dirty
if !cache.IsDirty {
return
}
for key, node := range cache.nodes { for key, node := range cache.nodes {
if node.Dirty { if node.Dirty {
cache.db.Put([]byte(key), node.Value.Encode()) cache.db.Put([]byte(key), node.Value.Encode())
node.Dirty = false node.Dirty = false
} }
} }
cache.IsDirty = false
// If the nodes grows beyond the 200 entries we simple empty it // If the nodes grows beyond the 200 entries we simple empty it
// FIXME come up with something better // FIXME come up with something better
@ -80,6 +88,7 @@ func (cache *Cache) Undo() {
delete(cache.nodes, key) delete(cache.nodes, key)
} }
} }
cache.IsDirty = false
} }
// A (modified) Radix Trie implementation. The Trie implements // A (modified) Radix Trie implementation. The Trie implements
@ -103,6 +112,10 @@ func (t *Trie) Sync() {
t.cache.Commit() t.cache.Commit()
} }
func (t *Trie) Undo() {
t.cache.Undo()
}
/* /*
* Public (query) interface functions * Public (query) interface functions
*/ */

View File

@ -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) { func TestTrieReset(t *testing.T) {
_, trie := New() _, trie := New()