mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-07 05:46:32 +00:00
store: fix deadlock in pruning (#6007)
This commit is contained in:
@@ -14,8 +14,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
prefixLightBlock = int64(0x0a)
|
||||
prefixSize = int64(0x0b)
|
||||
prefixLightBlock = int64(11)
|
||||
prefixSize = int64(12)
|
||||
)
|
||||
|
||||
type dbs struct {
|
||||
@@ -230,27 +230,11 @@ func (s *dbs) Prune(size uint16) error {
|
||||
}
|
||||
numToPrune := sSize - size
|
||||
|
||||
// 2) Iterate over headers and perform a batch operation.
|
||||
itr, err := s.db.Iterator(
|
||||
s.lbKey(1),
|
||||
append(s.lbKey(1<<63-1), byte(0x00)),
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer itr.Close()
|
||||
|
||||
b := s.db.NewBatch()
|
||||
defer b.Close()
|
||||
|
||||
for itr.Valid() && numToPrune > 0 {
|
||||
if err = b.Delete(itr.Key()); err != nil {
|
||||
return err
|
||||
}
|
||||
itr.Next()
|
||||
numToPrune--
|
||||
}
|
||||
if err = itr.Error(); err != nil {
|
||||
// 2) use an iterator to batch together all the blocks that need to be deleted
|
||||
if err := s.batchDelete(b, numToPrune); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -261,12 +245,7 @@ func (s *dbs) Prune(size uint16) error {
|
||||
}
|
||||
|
||||
// 4) write batch deletion to disk
|
||||
err = b.WriteSync()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
return b.WriteSync()
|
||||
}
|
||||
|
||||
// Size returns the number of header & validator set pairs.
|
||||
@@ -278,6 +257,27 @@ func (s *dbs) Size() uint16 {
|
||||
return s.size
|
||||
}
|
||||
|
||||
func (s *dbs) batchDelete(batch dbm.Batch, numToPrune uint16) error {
|
||||
itr, err := s.db.Iterator(
|
||||
s.lbKey(1),
|
||||
append(s.lbKey(1<<63-1), byte(0x00)),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer itr.Close()
|
||||
|
||||
for itr.Valid() && numToPrune > 0 {
|
||||
if err = batch.Delete(itr.Key()); err != nil {
|
||||
return err
|
||||
}
|
||||
itr.Next()
|
||||
numToPrune--
|
||||
}
|
||||
|
||||
return itr.Error()
|
||||
}
|
||||
|
||||
func (s *dbs) sizeKey() []byte {
|
||||
key, err := orderedcode.Append(nil, prefixSize)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user