diff --git a/exchange/bitswap/bitswap.go b/exchange/bitswap/bitswap.go index 1a4ec73cf..5508f66e3 100644 --- a/exchange/bitswap/bitswap.go +++ b/exchange/bitswap/bitswap.go @@ -368,14 +368,19 @@ func (bs *bitswap) wantNewBlocks(ctx context.Context, bkeys []u.Key) { for i, k := range bkeys { message.AddEntry(k, kMaxPriority-i) } + + wg := sync.WaitGroup{} for _, p := range bs.engine.Peers() { + wg.Add(1) go func(p peer.ID) { + defer wg.Done() err := bs.send(ctx, p, message) if err != nil { log.Debugf("Error sending message: %s", err) } }(p) } + wg.Wait() } func (bs *bitswap) ReceiveError(err error) { diff --git a/exchange/bitswap/workers.go b/exchange/bitswap/workers.go index 8239fced3..3753edb62 100644 --- a/exchange/bitswap/workers.go +++ b/exchange/bitswap/workers.go @@ -90,7 +90,11 @@ func (bs *bitswap) clientWorker(parent context.Context) { bs.wantlist.Add(k, kMaxPriority-i) } - bs.wantNewBlocks(req.ctx, keys) + done := make(chan struct{}) + go func() { + bs.wantNewBlocks(req.ctx, keys) + close(done) + }() // NB: Optimization. Assumes that providers of key[0] are likely to // be able to provide for all keys. This currently holds true in most @@ -101,6 +105,10 @@ func (bs *bitswap) clientWorker(parent context.Context) { if err != nil { log.Debugf("error sending wantlist: %s", err) } + + // Wait for wantNewBlocks to finish + <-done + case <-parent.Done(): return }