Fixed iterator

This commit is contained in:
obscuren 2015-02-07 17:03:22 +01:00
parent 44eafb15e0
commit 99ebb869bf
2 changed files with 40 additions and 2 deletions

View File

@ -23,7 +23,6 @@ func (self *Iterator) Next() bool {
self.Key = []byte(DecodeCompact(k)) self.Key = []byte(DecodeCompact(k))
return len(k) > 0 return len(k) > 0
} }
func (self *Iterator) next(node Node, key []byte) []byte { 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) { if BeginsWith(key, k) {
ret = self.next(cnode, skey) ret = self.next(cnode, skey)
} else if bytes.Compare(k, key[:len(k)]) > 0 { } else if bytes.Compare(k, key[:len(k)]) > 0 {
ret = self.key(node) return self.key(node)
} }
if ret != nil { if ret != nil {

View File

@ -257,3 +257,42 @@ func BenchmarkUpdate(b *testing.B) {
} }
trie.Hash() 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)
}
}
}