fix(stf/branch/memiter): Fix Iter validity (#21556)

This commit is contained in:
testinginprod 2024-09-09 10:37:59 +02:00 committed by GitHub
parent b92c173ca4
commit b1bf48867c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 4 deletions

View File

@ -5,8 +5,6 @@ import (
"errors"
"github.com/tidwall/btree"
"cosmossdk.io/core/store"
)
const (
@ -55,7 +53,7 @@ func (bt changeSet) delete(key []byte) {
// iterator returns a new iterator over the key-value pairs in the changeSet
// that have keys greater than or equal to the start key and less than the end key.
func (bt changeSet) iterator(start, end []byte) (store.Iterator, error) {
func (bt changeSet) iterator(start, end []byte) (*memIterator, error) {
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, errKeyEmpty
}
@ -65,7 +63,7 @@ func (bt changeSet) iterator(start, end []byte) (store.Iterator, error) {
// reverseIterator returns a new iterator that iterates over the key-value pairs in reverse order
// within the specified range [start, end) in the changeSet's tree.
// If start or end is an empty byte slice, it returns an error indicating that the key is empty.
func (bt changeSet) reverseIterator(start, end []byte) (store.Iterator, error) {
func (bt changeSet) reverseIterator(start, end []byte) (*memIterator, error) {
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, errKeyEmpty
}
@ -158,6 +156,7 @@ func (mi *memIterator) Domain() (start, end []byte) {
// Close releases any resources held by the iterator.
func (mi *memIterator) Close() error {
mi.iter.Release()
mi.valid = false
return nil
}

View File

@ -0,0 +1,28 @@
package branch
import (
"testing"
)
func Test_memIterator(t *testing.T) {
t.Run("iter is invalid after close", func(t *testing.T) {
cs := newChangeSet()
for i := byte(0); i < 32; i++ {
cs.set([]byte{0, i}, []byte{i})
}
it, err := cs.iterator(nil, nil)
if err != nil {
t.Fatal(err)
}
err = it.Close()
if err != nil {
t.Fatal(err)
}
if it.Valid() {
t.Fatal("iterator must be invalid")
}
})
}