ethdb/pebble: don't double-close iterator inside pebbleIterator (#28566)

Adds 'released' flag to pebbleIterator to avoid double closing cockroachdb/pebble.Iterator as it is an invalid operation.

Fixes #28565
This commit is contained in:
Maciej Kulawik 2023-11-21 14:22:22 +00:00 committed by Anshal Shukla
parent b1bb876d0a
commit 123a9b5593
No known key found for this signature in database
GPG key ID: 84BE5474523D8CBC

View file

@ -650,9 +650,12 @@ func (b *batch) Replay(w ethdb.KeyValueWriter) error {
// pebbleIterator is a wrapper of underlying iterator in storage engine. // pebbleIterator is a wrapper of underlying iterator in storage engine.
// The purpose of this structure is to implement the missing APIs. // The purpose of this structure is to implement the missing APIs.
//
// The pebble iterator is not thread-safe.
type pebbleIterator struct { type pebbleIterator struct {
iter *pebble.Iterator iter *pebble.Iterator
moved bool moved bool
released bool
} }
// NewIterator creates a binary-alphabetical iterator over a subset // NewIterator creates a binary-alphabetical iterator over a subset
@ -664,8 +667,7 @@ func (d *Database) NewIterator(prefix []byte, start []byte) ethdb.Iterator {
UpperBound: upperBound(prefix), UpperBound: upperBound(prefix),
}) })
iter.First() iter.First()
return &pebbleIterator{iter: iter, moved: true, released: false}
return &pebbleIterator{iter: iter, moved: true}
} }
// Next moves the iterator to the next key/value pair. It returns whether the // Next moves the iterator to the next key/value pair. It returns whether the
@ -701,4 +703,9 @@ func (iter *pebbleIterator) Value() []byte {
// Release releases associated resources. Release should always succeed and can // Release releases associated resources. Release should always succeed and can
// be called multiple times without causing error. // be called multiple times without causing error.
func (iter *pebbleIterator) Release() { iter.iter.Close() } func (iter *pebbleIterator) Release() {
if !iter.released {
iter.iter.Close()
iter.released = true
}
}