From c036fe35a8513d8f8ea74c6cbe0190c60f088862 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Tue, 21 Apr 2020 16:26:02 +0200 Subject: [PATCH] core/state/snapshot: make difflayer account iterator seek operation inclusive --- core/state/snapshot/iterator.go | 2 +- core/state/snapshot/iterator_test.go | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/core/state/snapshot/iterator.go b/core/state/snapshot/iterator.go index e6a0cd947..d0ceb8959 100644 --- a/core/state/snapshot/iterator.go +++ b/core/state/snapshot/iterator.go @@ -70,7 +70,7 @@ func (dl *diffLayer) AccountIterator(seek common.Hash) AccountIterator { // Seek out the requested starting account hashes := dl.AccountList() index := sort.Search(len(hashes), func(i int) bool { - return bytes.Compare(seek[:], hashes[i][:]) < 0 + return bytes.Compare(seek[:], hashes[i][:]) <= 0 }) // Assemble and returned the already seeked iterator return &diffAccountIterator{ diff --git a/core/state/snapshot/iterator_test.go b/core/state/snapshot/iterator_test.go index 5468a9a58..a3bb48819 100644 --- a/core/state/snapshot/iterator_test.go +++ b/core/state/snapshot/iterator_test.go @@ -351,22 +351,30 @@ func TestAccountIteratorSeek(t *testing.T) { snaps.Update(common.HexToHash("0x04"), common.HexToHash("0x03"), nil, randomAccountSet("0xcc", "0xf0", "0xff"), nil) - // Construct various iterators and ensure their tranversal is correct + // Account set is now + // 02: aa, ee, f0, ff + // 03: aa, bb, dd, ee, f0 (, f0), ff + // 04: aa, bb, cc, dd, ee, f0 (, f0), ff (, ff) + // Construct various iterators and ensure their traversal is correct it, _ := snaps.AccountIterator(common.HexToHash("0x02"), common.HexToHash("0xdd")) defer it.Release() verifyIterator(t, 3, it) // expected: ee, f0, ff it, _ = snaps.AccountIterator(common.HexToHash("0x02"), common.HexToHash("0xaa")) defer it.Release() - verifyIterator(t, 3, it) // expected: ee, f0, ff + verifyIterator(t, 4, it) // expected: aa, ee, f0, ff it, _ = snaps.AccountIterator(common.HexToHash("0x02"), common.HexToHash("0xff")) defer it.Release() + verifyIterator(t, 1, it) // expected: ff + + it, _ = snaps.AccountIterator(common.HexToHash("0x02"), common.HexToHash("0xff1")) + defer it.Release() verifyIterator(t, 0, it) // expected: nothing it, _ = snaps.AccountIterator(common.HexToHash("0x04"), common.HexToHash("0xbb")) defer it.Release() - verifyIterator(t, 5, it) // expected: cc, dd, ee, f0, ff + verifyIterator(t, 6, it) // expected: bb, cc, dd, ee, f0, ff it, _ = snaps.AccountIterator(common.HexToHash("0x04"), common.HexToHash("0xef")) defer it.Release() @@ -374,11 +382,16 @@ func TestAccountIteratorSeek(t *testing.T) { it, _ = snaps.AccountIterator(common.HexToHash("0x04"), common.HexToHash("0xf0")) defer it.Release() - verifyIterator(t, 1, it) // expected: ff + verifyIterator(t, 2, it) // expected: f0, ff it, _ = snaps.AccountIterator(common.HexToHash("0x04"), common.HexToHash("0xff")) defer it.Release() + verifyIterator(t, 1, it) // expected: ff + + it, _ = snaps.AccountIterator(common.HexToHash("0x04"), common.HexToHash("0xff1")) + defer it.Release() verifyIterator(t, 0, it) // expected: nothing + } // TestIteratorDeletions tests that the iterator behaves correct when there are