aboutsummaryrefslogtreecommitdiffstats
path: root/trie
diff options
context:
space:
mode:
Diffstat (limited to 'trie')
-rw-r--r--trie/iterator.go3
-rw-r--r--trie/trie_test.go39
2 files changed, 40 insertions, 2 deletions
diff --git a/trie/iterator.go b/trie/iterator.go
index f0dae28bb..3b3ddd751 100644
--- a/trie/iterator.go
+++ b/trie/iterator.go
@@ -23,7 +23,6 @@ func (self *Iterator) Next() bool {
self.Key = []byte(DecodeCompact(k))
return len(k) > 0
-
}
func (self *Iterator) next(node Node, key []byte) []byte {
@@ -67,7 +66,7 @@ func (self *Iterator) next(node Node, key []byte) []byte {
if BeginsWith(key, k) {
ret = self.next(cnode, skey)
} else if bytes.Compare(k, key[:len(k)]) > 0 {
- ret = self.key(node)
+ return self.key(node)
}
if ret != nil {
diff --git a/trie/trie_test.go b/trie/trie_test.go
index ffb78d4f2..4b185f355 100644
--- a/trie/trie_test.go
+++ b/trie/trie_test.go
@@ -257,3 +257,42 @@ func BenchmarkUpdate(b *testing.B) {
}
trie.Hash()
}
+
+type kv struct {
+ k, v []byte
+ t bool
+}
+
+func TestLargeData(t *testing.T) {
+ trie := NewEmpty()
+ vals := make(map[string]*kv)
+
+ for i := byte(1); i < 255; i++ {
+ value := &kv{ethutil.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
+ value2 := &kv{ethutil.LeftPadBytes([]byte{10, i}, 32), []byte{i}, false}
+ trie.Update(value.k, value.v)
+ trie.Update(value2.k, value2.v)
+ vals[string(value.k)] = value
+ vals[string(value2.k)] = value2
+ fmt.Println(value, "\n", value2)
+ }
+
+ it := trie.Iterator()
+ for it.Next() {
+ vals[string(it.Key)].t = true
+ }
+
+ var untouched []*kv
+ for _, value := range vals {
+ if !value.t {
+ untouched = append(untouched, value)
+ }
+ }
+
+ if len(untouched) > 0 {
+ t.Errorf("Missed %d nodes", len(untouched))
+ for _, value := range untouched {
+ t.Error(value)
+ }
+ }
+}