From 9c66f65410afa87a44d4bd2a455dd246ab626760 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 26 Feb 2015 10:12:21 -0800 Subject: [PATCH 1/2] make wantlist updates to connected peers happen async, dramatically improves performance between connected nodes --- exchange/bitswap/bitswap.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/exchange/bitswap/bitswap.go b/exchange/bitswap/bitswap.go index 500817b0a..1a4ec73cf 100644 --- a/exchange/bitswap/bitswap.go +++ b/exchange/bitswap/bitswap.go @@ -369,10 +369,12 @@ func (bs *bitswap) wantNewBlocks(ctx context.Context, bkeys []u.Key) { message.AddEntry(k, kMaxPriority-i) } for _, p := range bs.engine.Peers() { - err := bs.send(ctx, p, message) - if err != nil { - log.Debugf("Error sending message: %s", err) - } + go func(p peer.ID) { + err := bs.send(ctx, p, message) + if err != nil { + log.Debugf("Error sending message: %s", err) + } + }(p) } } From 8256b180588bfd9a8286b9416b5aafb3624c10ec Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 26 Feb 2015 16:43:18 -0800 Subject: [PATCH 2/2] make sure not to orphan any extra goroutines --- exchange/bitswap/bitswap.go | 5 +++++ exchange/bitswap/workers.go | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) 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 }