diff --git a/core/rawdb/table_test.go b/core/rawdb/table_test.go index dd7936cef0..34d1f96ee6 100644 --- a/core/rawdb/table_test.go +++ b/core/rawdb/table_test.go @@ -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) } diff --git a/core/state/snapshot/wipe.go b/core/state/snapshot/wipe.go index 52d32e4268..8ffc2ccb14 100644 --- a/core/state/snapshot/wipe.go +++ b/core/state/snapshot/wipe.go @@ -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 { diff --git a/les/clientpool.go b/les/clientpool.go index b01c825a7a..6efcc0afde 100644 --- a/les/clientpool.go +++ b/les/clientpool.go @@ -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]-- diff --git a/trie/sync_bloom.go b/trie/sync_bloom.go index 2182d1c437..e792e6f75a 100644 --- a/trie/sync_bloom.go +++ b/trie/sync_bloom.go @@ -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()