mirror of
https://github.com/tendermint/tendermint.git
synced 2026-04-17 14:11:08 +00:00
light: fix light store deadlock (#5901)
This commit is contained in:
@@ -243,12 +243,14 @@ func (s *dbs) Prune(size uint16) error {
|
||||
b := s.db.NewBatch()
|
||||
defer b.Close()
|
||||
|
||||
var pruned uint16 = 0
|
||||
for itr.Valid() && numToPrune > 0 {
|
||||
if err = b.Delete(itr.Key()); err != nil {
|
||||
return err
|
||||
}
|
||||
itr.Next()
|
||||
numToPrune--
|
||||
pruned++
|
||||
}
|
||||
if err = itr.Error(); err != nil {
|
||||
return err
|
||||
@@ -256,11 +258,12 @@ func (s *dbs) Prune(size uint16) error {
|
||||
|
||||
// 3) // update size
|
||||
s.mtx.Lock()
|
||||
s.size = size
|
||||
s.size -= pruned
|
||||
newSize := s.size
|
||||
s.mtx.Unlock()
|
||||
|
||||
if wErr := b.Set(s.sizeKey(), marshalSize(size)); wErr != nil {
|
||||
return fmt.Errorf("failed to persist size: %w", wErr)
|
||||
if err := b.Set(s.sizeKey(), marshalSize(newSize)); err != nil {
|
||||
return fmt.Errorf("failed to persist size: %w", err)
|
||||
}
|
||||
|
||||
// 4) write batch deletion to disk
|
||||
|
||||
@@ -148,6 +148,13 @@ func Test_Concurrency(t *testing.T) {
|
||||
t.Log(err)
|
||||
}
|
||||
|
||||
if i > 2 {
|
||||
_, err = dbStore.LightBlockBefore(i - 1)
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
}
|
||||
}
|
||||
|
||||
_, err = dbStore.LastLightBlockHeight()
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
@@ -157,16 +164,19 @@ func Test_Concurrency(t *testing.T) {
|
||||
t.Log(err)
|
||||
}
|
||||
|
||||
err = dbStore.Prune(2)
|
||||
err = dbStore.Prune(3)
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
}
|
||||
_ = dbStore.Size()
|
||||
|
||||
err = dbStore.DeleteLightBlock(1)
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
if i > 2 && i%2 == 0 {
|
||||
err = dbStore.DeleteLightBlock(i - 1)
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
}
|
||||
}
|
||||
|
||||
}(int64(i))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user