0
0

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:
Patrick Mezard 2015-10-20 19:01:29 +02:00
parent aada2e7333
commit 5d7628ba3b
2 changed files with 15 additions and 4 deletions

View File

@ -29,14 +29,19 @@ type Iterator struct {
func (i *Iterator) updateValid() {
i.valid = (i.key != nil)
if i.valid && i.prefix != nil {
i.valid = bytes.HasPrefix(i.key, i.prefix)
} else if i.end != nil {
i.valid = bytes.Compare(i.key, i.end) < 0
if i.valid {
if i.prefix != nil {
i.valid = bytes.HasPrefix(i.key, i.prefix)
} else if i.end != nil {
i.valid = bytes.Compare(i.key, i.end) < 0
}
}
}
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.updateValid()
}

View File

@ -72,6 +72,12 @@ func TestBoltDBRangeIterator(t *testing.T) {
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) {
s := open(t, &test.TestMergeCounter{})
defer cleanup(t, s)