Browse Source

patch concurrency issue with pruning in the light store (#5910)

pull/5915/head
Callum Waters 4 years ago
committed by GitHub
parent
commit
5cbb8263b4
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 4 additions and 10 deletions
  1. +4
    -10
      light/store/db/db.go

+ 4
- 10
light/store/db/db.go View File

@ -221,9 +221,9 @@ func (s *dbs) LightBlockBefore(height int64) (*types.LightBlock, error) {
// Safe for concurrent use by multiple goroutines. // Safe for concurrent use by multiple goroutines.
func (s *dbs) Prune(size uint16) error { func (s *dbs) Prune(size uint16) error {
// 1) Check how many we need to prune. // 1) Check how many we need to prune.
s.mtx.RLock()
s.mtx.Lock()
defer s.mtx.Unlock()
sSize := s.size sSize := s.size
s.mtx.RUnlock()
if sSize <= size { // nothing to prune if sSize <= size { // nothing to prune
return nil return nil
@ -243,26 +243,20 @@ func (s *dbs) Prune(size uint16) error {
b := s.db.NewBatch() b := s.db.NewBatch()
defer b.Close() defer b.Close()
var pruned uint16 = 0
for itr.Valid() && numToPrune > 0 { for itr.Valid() && numToPrune > 0 {
if err = b.Delete(itr.Key()); err != nil { if err = b.Delete(itr.Key()); err != nil {
return err return err
} }
itr.Next() itr.Next()
numToPrune-- numToPrune--
pruned++
} }
if err = itr.Error(); err != nil { if err = itr.Error(); err != nil {
return err return err
} }
// 3) // update size // 3) // update size
s.mtx.Lock()
s.size -= pruned
newSize := s.size
s.mtx.Unlock()
if err := b.Set(s.sizeKey(), marshalSize(newSize)); err != nil {
s.size = size
if err := b.Set(s.sizeKey(), marshalSize(size)); err != nil {
return fmt.Errorf("failed to persist size: %w", err) return fmt.Errorf("failed to persist size: %w", err)
} }


Loading…
Cancel
Save