mirror of
https://github.com/fluencelabs/tendermint
synced 2025-05-06 20:12:15 +00:00
libs/db: close boltDBIterator (#3627)
Refs https://github.com/tendermint/tendermint/pull/3610#discussion_r281201274 If we do not close, other txs will be stuck forever.
This commit is contained in:
parent
debf8f70c9
commit
60b833403c
@ -190,31 +190,31 @@ func (bdb *boltDBBatch) WriteSync() {
|
|||||||
|
|
||||||
func (bdb *boltDBBatch) Close() {}
|
func (bdb *boltDBBatch) Close() {}
|
||||||
|
|
||||||
// WARNING: Any concurrent writes (Set, SetSync) will block until the Iterator
|
// WARNING: Any concurrent writes or reads will block until the iterator is
|
||||||
// is closed.
|
// closed.
|
||||||
func (bdb *BoltDB) Iterator(start, end []byte) Iterator {
|
func (bdb *BoltDB) Iterator(start, end []byte) Iterator {
|
||||||
tx, err := bdb.db.Begin(false)
|
tx, err := bdb.db.Begin(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
c := tx.Bucket(bucket).Cursor()
|
return newBoltDBIterator(tx, start, end, false)
|
||||||
return newBoltDBIterator(c, start, end, false)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WARNING: Any concurrent writes (Set, SetSync) will block until the Iterator
|
// WARNING: Any concurrent writes or reads will block until the iterator is
|
||||||
// is closed.
|
// closed.
|
||||||
func (bdb *BoltDB) ReverseIterator(start, end []byte) Iterator {
|
func (bdb *BoltDB) ReverseIterator(start, end []byte) Iterator {
|
||||||
tx, err := bdb.db.Begin(false)
|
tx, err := bdb.db.Begin(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
c := tx.Bucket(bucket).Cursor()
|
return newBoltDBIterator(tx, start, end, true)
|
||||||
return newBoltDBIterator(c, start, end, true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// boltDBIterator allows you to iterate on range of keys/values given some
|
// boltDBIterator allows you to iterate on range of keys/values given some
|
||||||
// start / end keys (nil & nil will result in doing full scan).
|
// start / end keys (nil & nil will result in doing full scan).
|
||||||
type boltDBIterator struct {
|
type boltDBIterator struct {
|
||||||
|
tx *bbolt.Tx
|
||||||
|
|
||||||
itr *bbolt.Cursor
|
itr *bbolt.Cursor
|
||||||
start []byte
|
start []byte
|
||||||
end []byte
|
end []byte
|
||||||
@ -226,7 +226,9 @@ type boltDBIterator struct {
|
|||||||
isReverse bool
|
isReverse bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBoltDBIterator(itr *bbolt.Cursor, start, end []byte, isReverse bool) *boltDBIterator {
|
func newBoltDBIterator(tx *bbolt.Tx, start, end []byte, isReverse bool) *boltDBIterator {
|
||||||
|
itr := tx.Bucket(bucket).Cursor()
|
||||||
|
|
||||||
var ck, cv []byte
|
var ck, cv []byte
|
||||||
if isReverse {
|
if isReverse {
|
||||||
if end == nil {
|
if end == nil {
|
||||||
@ -244,6 +246,7 @@ func newBoltDBIterator(itr *bbolt.Cursor, start, end []byte, isReverse bool) *bo
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &boltDBIterator{
|
return &boltDBIterator{
|
||||||
|
tx: tx,
|
||||||
itr: itr,
|
itr: itr,
|
||||||
start: start,
|
start: start,
|
||||||
end: end,
|
end: end,
|
||||||
@ -304,8 +307,12 @@ func (itr *boltDBIterator) Value() []byte {
|
|||||||
return itr.currentValue
|
return itr.currentValue
|
||||||
}
|
}
|
||||||
|
|
||||||
// boltdb cursor has no close op.
|
func (itr *boltDBIterator) Close() {
|
||||||
func (itr *boltDBIterator) Close() {}
|
err := itr.tx.Rollback()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (itr *boltDBIterator) assertIsValid() {
|
func (itr *boltDBIterator) assertIsValid() {
|
||||||
if !itr.Valid() {
|
if !itr.Valid() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user