From e4a8a2ed651bd745b03bb11073c06c0a559fbeb0 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 7 Dec 2014 20:54:31 +0000 Subject: [PATCH] same block cant be sent twice to a peer within a certain time period --- exchange/bitswap/strategy/ledger.go | 4 ++-- exchange/bitswap/strategy/strategy.go | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/exchange/bitswap/strategy/ledger.go b/exchange/bitswap/strategy/ledger.go index 525b6af56..84e92d035 100644 --- a/exchange/bitswap/strategy/ledger.go +++ b/exchange/bitswap/strategy/ledger.go @@ -16,7 +16,7 @@ func newLedger(p peer.Peer, strategy strategyFunc) *ledger { wantList: keySet{}, Strategy: strategy, Partner: p, - sentToPeer: make(map[u.Key]struct{}), + sentToPeer: make(map[u.Key]time.Time), } } @@ -43,7 +43,7 @@ type ledger struct { // sentToPeer is a set of keys to ensure we dont send duplicate blocks // to a given peer - sentToPeer map[u.Key]struct{} + sentToPeer map[u.Key]time.Time Strategy strategyFunc } diff --git a/exchange/bitswap/strategy/strategy.go b/exchange/bitswap/strategy/strategy.go index af1c35848..fe7414caa 100644 --- a/exchange/bitswap/strategy/strategy.go +++ b/exchange/bitswap/strategy/strategy.go @@ -10,6 +10,8 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +const resendTimeoutPeriod = time.Minute + var log = u.Logger("strategy") // TODO niceness should be on a per-peer basis. Use-case: Certain peers are @@ -66,8 +68,9 @@ func (s *strategist) ShouldSendBlockToPeer(k u.Key, p peer.Peer) bool { ledger := s.ledger(p) - // Dont resend blocks - if _, ok := ledger.sentToPeer[k]; ok { + // Dont resend blocks within a certain time period + t, ok := ledger.sentToPeer[k] + if ok && t.Add(resendTimeoutPeriod).After(time.Now()) { return false } @@ -79,7 +82,7 @@ func (s *strategist) BlockSentToPeer(k u.Key, p peer.Peer) { defer s.lock.Unlock() ledger := s.ledger(p) - ledger.sentToPeer[k] = struct{}{} + ledger.sentToPeer[k] = time.Now() } func (s *strategist) Seed(int64) {