From 7280aac83ff52af54225cde33188d0b7b9ee9b4b Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Tue, 16 Dec 2014 21:28:55 -0800 Subject: [PATCH] perf: avoid lots of communication by signaling once at end of method License: MIT Signed-off-by: Brian Tiger Chow --- exchange/bitswap/strategy/ledgermanager.go | 25 +++++++++++----------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/exchange/bitswap/strategy/ledgermanager.go b/exchange/bitswap/strategy/ledgermanager.go index d328510a1..a84a5b7c8 100644 --- a/exchange/bitswap/strategy/ledgermanager.go +++ b/exchange/bitswap/strategy/ledgermanager.go @@ -104,6 +104,16 @@ func (lm *LedgerManager) BlockIsWantedByPeer(k u.Key, p peer.Peer) bool { // MessageReceived performs book-keeping. Returns error if passed invalid // arguments. func (lm *LedgerManager) MessageReceived(p peer.Peer, m bsmsg.BitSwapMessage) error { + newWorkExists := false + defer func() { + if newWorkExists { + // Signal task generation to restart (if stopped!) + select { + case lm.workSignal <- struct{}{}: + default: + } + } + }() lm.lock.Lock() defer lm.lock.Unlock() @@ -117,13 +127,8 @@ func (lm *LedgerManager) MessageReceived(p peer.Peer, m bsmsg.BitSwapMessage) er lm.tasklist.Cancel(e.Key, p) } else { l.Wants(e.Key, e.Priority) + newWorkExists = true lm.tasklist.Push(e.Key, e.Priority, p) - - // Signal task generation to restart (if stopped!) - select { - case lm.workSignal <- struct{}{}: - default: - } } } @@ -132,14 +137,8 @@ func (lm *LedgerManager) MessageReceived(p peer.Peer, m bsmsg.BitSwapMessage) er l.ReceivedBytes(len(block.Data)) for _, l := range lm.ledgerMap { if l.WantListContains(block.Key()) { + newWorkExists = true lm.tasklist.Push(block.Key(), 1, l.Partner) - - // Signal task generation to restart (if stopped!) - select { - case lm.workSignal <- struct{}{}: - default: - } - } } }