good morning!!!!

Skip to content
Snippets Groups Projects
Commit e4a6ee3d authored by Jeffrey Wilcke's avatar Jeffrey Wilcke
Browse files

Added dirty tracking on the cache

parent 72640441
Branches
Tags
No related merge requests found
......@@ -22,6 +22,7 @@ func (n *Node) Copy() *Node {
type Cache struct {
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()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment