Skip to content

Commit

Permalink
fix deadlock in bitswap sessions
Browse files Browse the repository at this point in the history
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: Steven Allen <steven@stebalien.com>
  • Loading branch information
Stebalien committed Nov 21, 2017
1 parent 218b299 commit 8dbfee7
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions exchange/bitswap/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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():
}
}

Expand Down

0 comments on commit 8dbfee7

Please sign in to comment.