Commit a94755db authored by Steven Allen's avatar Steven Allen

fix deadlock in bitswap sessions

This deadlock would happen when calling SessionsForBlock (holding
bitswap.sessLk) while the session's main loop was trying to deregister the
session (taking bitswap.sessLk).

I've also defensively added selects on contexts for two other channel writes
just in case.

fixes #4394

...well, it fixes *a* deadlock showing up in that issue, there may be more.

License: MIT
Signed-off-by: default avatarSteven Allen <steven@stebalien.com>
parent 218b2995
......@@ -120,9 +120,13 @@ type interestReq struct {
// still be in the interest cache.
func (s *Session) isLiveWant(c *cid.Cid) bool {
resp := make(chan bool, 1)
s.interestReqs <- interestReq{
select {
case s.interestReqs <- interestReq{
c: c,
resp: resp,
}:
case <-s.ctx.Done():
return false
}
select {
......@@ -278,13 +282,17 @@ func (s *Session) cancel(keys []*cid.Cid) {
}
func (s *Session) cancelWants(keys []*cid.Cid) {
s.cancelKeys <- keys
select {
case s.cancelKeys <- keys:
case <-s.ctx.Done():
}
}
func (s *Session) fetch(ctx context.Context, keys []*cid.Cid) {
select {
case s.newReqs <- keys:
case <-ctx.Done():
case <-s.ctx.Done():
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment