diff --git a/ctxcdb/pebble/pebble.go b/ctxcdb/pebble/pebble.go index c516f2e378..bfc8c82995 100644 --- a/ctxcdb/pebble/pebble.go +++ b/ctxcdb/pebble/pebble.go @@ -599,9 +599,12 @@ func (b *batch) Replay(w ctxcdb.KeyValueWriter) error { // pebbleIterator is a wrapper of underlying iterator in storage engine. // The purpose of this structure is to implement the missing APIs. +// +// The pebble iterator is not thread-safe. type pebbleIterator struct { - iter *pebble.Iterator - moved bool + iter *pebble.Iterator + moved bool + released bool } // NewIterator creates a binary-alphabetical iterator over a subset @@ -613,7 +616,7 @@ func (d *Database) NewIterator(prefix []byte, start []byte) ctxcdb.Iterator { UpperBound: upperBound(prefix), }) iter.First() - return &pebbleIterator{iter: iter, moved: true} + return &pebbleIterator{iter: iter, moved: true, released: false} } // Next moves the iterator to the next key/value pair. It returns whether the @@ -648,4 +651,9 @@ func (iter *pebbleIterator) Value() []byte { // Release releases associated resources. Release should always succeed and can // 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 + } +}