Skip to content

Commit

Permalink
core/bloombits: avoid crash when storing errors of different type (et…
Browse files Browse the repository at this point in the history
…hereum#23437)

This fixes a rare crash which could occur when two different errors happened
in the same bloombits.MatcherSession.
  • Loading branch information
otherview authored and Martin committed Aug 28, 2021
1 parent e97328b commit 2a65f68
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions core/bloombits/matcher.go
Expand Up @@ -510,8 +510,9 @@ type MatcherSession struct {
closer sync.Once // Sync object to ensure we only ever close once
quit chan struct{} // Quit channel to request pipeline termination

ctx context.Context // Context used by the light client to abort filtering
err atomic.Value // Global error to track retrieval failures deep in the chain
ctx context.Context // Context used by the light client to abort filtering
err error // Global error to track retrieval failures deep in the chain
errLock sync.Mutex

pend sync.WaitGroup
}
Expand All @@ -529,10 +530,10 @@ func (s *MatcherSession) Close() {

// Error returns any failure encountered during the matching session.
func (s *MatcherSession) Error() error {
if err := s.err.Load(); err != nil {
return err.(error)
}
return nil
s.errLock.Lock()
defer s.errLock.Unlock()

return s.err
}

// allocateRetrieval assigns a bloom bit index to a client process that can either
Expand Down Expand Up @@ -630,7 +631,9 @@ func (s *MatcherSession) Multiplex(batch int, wait time.Duration, mux chan chan

result := <-request
if result.Error != nil {
s.err.Store(result.Error)
s.errLock.Lock()
s.err = result.Error
s.errLock.Unlock()
s.Close()
}
s.deliverSections(result.Bit, result.Sections, result.Bitsets)
Expand Down

0 comments on commit 2a65f68

Please sign in to comment.