forked from cerc-io/plugeth
core/bloombits: fix deadlock when matcher session hits an error (#28184)
When MatcherSession encounters an error, it attempts to close the session. Closing waits for all goroutines to finish, including the 'distributor'. However, the distributor will not exit until all requests have returned. This patch fixes the issue by delivering the (empty) result to the distributor before calling Close().
This commit is contained in:
parent
d051ea5e89
commit
c2cfe35f12
@ -630,13 +630,16 @@ func (s *MatcherSession) Multiplex(batch int, wait time.Duration, mux chan chan
|
|||||||
request <- &Retrieval{Bit: bit, Sections: sections, Context: s.ctx}
|
request <- &Retrieval{Bit: bit, Sections: sections, Context: s.ctx}
|
||||||
|
|
||||||
result := <-request
|
result := <-request
|
||||||
|
|
||||||
|
// Deliver a result before s.Close() to avoid a deadlock
|
||||||
|
s.deliverSections(result.Bit, result.Sections, result.Bitsets)
|
||||||
|
|
||||||
if result.Error != nil {
|
if result.Error != nil {
|
||||||
s.errLock.Lock()
|
s.errLock.Lock()
|
||||||
s.err = result.Error
|
s.err = result.Error
|
||||||
s.errLock.Unlock()
|
s.errLock.Unlock()
|
||||||
s.Close()
|
s.Close()
|
||||||
}
|
}
|
||||||
s.deliverSections(result.Bit, result.Sections, result.Bitsets)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user