Przeglądaj źródła

Added dirty tracking on the cache

obscuren 11 lat temu
rodzic
commit
e4a6ee3d7f
2 zmienionych plików z 35 dodań i 2 usunięć
  1. 15 2
      ethutil/trie.go
  2. 20 0
      ethutil/trie_test.go

+ 15 - 2
ethutil/trie.go

@@ -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
  */

+ 20 - 0
ethutil/trie_test.go

@@ -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()