les, core/state/snapshot: iterator fixes

This commit is contained in:
Martin Holst Swende 2020-03-25 13:26:30 +01:00
parent 9779087655
commit 573f62f0b0
No known key found for this signature in database
GPG key ID: 683B438C05A5DDF0
4 changed files with 38 additions and 45 deletions

View file

@ -19,6 +19,8 @@ package rawdb
import (
"bytes"
"testing"
"github.com/ethereum/go-ethereum/ethdb"
)
func TestTableDatabase(t *testing.T) { testTableDatabase(t, "prefix") }
@ -96,49 +98,31 @@ func testTableDatabase(t *testing.T, prefix string) {
}
}
check := func(iter ethdb.Iterator, expCount, index int) {
count := 0
for iter.Next() {
key, value := iter.Key(), iter.Value()
if !bytes.Equal(key, entries[index].key) {
t.Fatalf("Key mismatch: want=%v, got=%v", entries[index].key, key)
}
if !bytes.Equal(value, entries[index].value) {
t.Fatalf("Value mismatch: want=%v, got=%v", entries[index].value, value)
}
index += 1
count++
}
if count != expCount {
t.Fatalf("Wrong number of elems, exp %d got %d", expCount, count)
}
iter.Release()
}
// Test iterators
iter := db.NewIterator()
var index int
for iter.Next() {
key, value := iter.Key(), iter.Value()
if !bytes.Equal(key, entries[index].key) {
t.Fatalf("Key mismatch: want=%v, got=%v", entries[index].key, key)
}
if !bytes.Equal(value, entries[index].value) {
t.Fatalf("Value mismatch: want=%v, got=%v", entries[index].value, value)
}
index += 1
}
iter.Release()
check(db.NewIterator(), 6, 0)
// Test iterators with prefix
iter = db.NewIteratorWithPrefix([]byte{0xff, 0xff})
index = 3
for iter.Next() {
key, value := iter.Key(), iter.Value()
if !bytes.Equal(key, entries[index].key) {
t.Fatalf("Key mismatch: want=%v, got=%v", entries[index].key, key)
}
if !bytes.Equal(value, entries[index].value) {
t.Fatalf("Value mismatch: want=%v, got=%v", entries[index].value, value)
}
index += 1
}
iter.Release()
check(db.NewIteratorWith([]byte{0xff, 0xff}, nil), 3, 3)
// Test iterators with start point
//iter = db.NewIteratorWithStart([]byte{0xff, 0xff, 0x02})
iter = db.NewIteratorWith(nil,[]byte{0xff, 0xff, 0x02})
index = 4
for iter.Next() {
key, value := iter.Key(), iter.Value()
if !bytes.Equal(key, entries[index].key) {
t.Fatalf("Key mismatch: want=%v, got=%v", entries[index].key, key)
}
if !bytes.Equal(value, entries[index].value) {
t.Fatalf("Value mismatch: want=%v, got=%v", entries[index].value, value)
}
index += 1
}
iter.Release()
check(db.NewIteratorWith(nil, []byte{0xff, 0xff, 0x02}), 2, 4)
// Test iterators with prefix and start point
check(db.NewIteratorWith([]byte{0xee}, nil), 0, 0)
check(db.NewIteratorWith(nil, []byte{0x00}), 6, 0)
}

View file

@ -113,7 +113,7 @@ func wipeKeyRange(db ethdb.KeyValueStore, kind string, prefix []byte, keylen int
return err
}
batch.Reset()
seekPos := bytes.Trim(key, prefix)
seekPos := key[len(prefix):]
it = db.NewIteratorWith(prefix, seekPos)
if time.Since(logged) > 8*time.Second {

View file

@ -691,6 +691,14 @@ func (db *nodeDB) close() {
close(db.closeCh)
}
func (db *nodeDB) getPrefix(neg bool) []byte {
prefix := positiveBalancePrefix
if neg {
prefix = negativeBalancePrefix
}
return append(db.verbuf[:], prefix...)
}
func (db *nodeDB) key(id []byte, neg bool) []byte {
prefix := positiveBalancePrefix
if neg {
@ -761,7 +769,8 @@ func (db *nodeDB) getPosBalanceIDs(start, stop enode.ID, maxCount int) (result [
if maxCount <= 0 {
return
}
it := db.db.NewIteratorWithStart(db.key(start.Bytes(), false))
prefix := db.getPrefix(false)
it := db.db.NewIteratorWith(prefix, start.Bytes())
defer it.Release()
for i := len(stop[:]) - 1; i >= 0; i-- {
stop[i]--

View file

@ -116,7 +116,7 @@ func (b *SyncBloom) init(database ethdb.Iteratee) {
key := common.CopyBytes(it.Key())
it.Release()
it = database.NewIteratorWithStart(key)
it = database.NewIteratorWith(nil, key)
log.Info("Initializing fast sync bloom", "items", b.bloom.N(), "errorrate", b.errorRate(), "elapsed", common.PrettyDuration(time.Since(start)))
swap = time.Now()