Selaa lähdekoodia

Fixed iterator

obscuren 10 vuotta sitten
vanhempi
commit
99ebb869bf
2 muutettua tiedostoa jossa 40 lisäystä ja 2 poistoa
  1. 1 2
      trie/iterator.go
  2. 39 0
      trie/trie_test.go

+ 1 - 2
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 {

+ 39 - 0
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)
+		}
+	}
+}