boltdb: fix RangeIterator outside of range seeks
Two issues: - Seeking before i.start and iterating returned keys before i.start - Seeking after the store last key did not invalidate the iterator and could cause infinite loops.
This commit is contained in:
parent
aada2e7333
commit
5d7628ba3b
@ -29,14 +29,19 @@ type Iterator struct {
|
|||||||
|
|
||||||
func (i *Iterator) updateValid() {
|
func (i *Iterator) updateValid() {
|
||||||
i.valid = (i.key != nil)
|
i.valid = (i.key != nil)
|
||||||
if i.valid && i.prefix != nil {
|
if i.valid {
|
||||||
i.valid = bytes.HasPrefix(i.key, i.prefix)
|
if i.prefix != nil {
|
||||||
} else if i.end != nil {
|
i.valid = bytes.HasPrefix(i.key, i.prefix)
|
||||||
i.valid = bytes.Compare(i.key, i.end) < 0
|
} else if i.end != nil {
|
||||||
|
i.valid = bytes.Compare(i.key, i.end) < 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Iterator) Seek(k []byte) {
|
func (i *Iterator) Seek(k []byte) {
|
||||||
|
if bytes.Compare(k, i.start) < 0 {
|
||||||
|
k = i.start
|
||||||
|
}
|
||||||
i.key, i.val = i.cursor.Seek(k)
|
i.key, i.val = i.cursor.Seek(k)
|
||||||
i.updateValid()
|
i.updateValid()
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,12 @@ func TestBoltDBRangeIterator(t *testing.T) {
|
|||||||
test.CommonTestRangeIterator(t, s)
|
test.CommonTestRangeIterator(t, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBoltDBRangeIteratorSeek(t *testing.T) {
|
||||||
|
s := open(t, nil)
|
||||||
|
defer cleanup(t, s)
|
||||||
|
test.CommonTestRangeIteratorSeek(t, s)
|
||||||
|
}
|
||||||
|
|
||||||
func TestBoltDBMerge(t *testing.T) {
|
func TestBoltDBMerge(t *testing.T) {
|
||||||
s := open(t, &test.TestMergeCounter{})
|
s := open(t, &test.TestMergeCounter{})
|
||||||
defer cleanup(t, s)
|
defer cleanup(t, s)
|
||||||
|
Loading…
Reference in New Issue
Block a user