提交 42d4c797 作者: Juan Batiz-Benet

Merge pull request #409 from jbenet/no-dupe-send

prevent sending of same block to a peer twice
...@@ -307,6 +307,7 @@ func (bs *bitswap) ReceiveMessage(ctx context.Context, p peer.Peer, incoming bsm ...@@ -307,6 +307,7 @@ func (bs *bitswap) ReceiveMessage(ctx context.Context, p peer.Peer, incoming bsm
blkmsg.AddBlock(block) blkmsg.AddBlock(block)
bs.send(ctx, p, blkmsg) bs.send(ctx, p, blkmsg)
bs.strategy.BlockSentToPeer(block.Key(), p)
} }
} }
} }
......
...@@ -32,6 +32,8 @@ type Strategy interface { ...@@ -32,6 +32,8 @@ type Strategy interface {
NumBytesReceivedFrom(peer.Peer) uint64 NumBytesReceivedFrom(peer.Peer) uint64
BlockSentToPeer(u.Key, peer.Peer)
// Values determining bitswap behavioural patterns // Values determining bitswap behavioural patterns
GetBatchSize() int GetBatchSize() int
GetRebroadcastDelay() time.Duration GetRebroadcastDelay() time.Duration
......
...@@ -16,6 +16,7 @@ func newLedger(p peer.Peer, strategy strategyFunc) *ledger { ...@@ -16,6 +16,7 @@ func newLedger(p peer.Peer, strategy strategyFunc) *ledger {
wantList: keySet{}, wantList: keySet{},
Strategy: strategy, Strategy: strategy,
Partner: p, Partner: p,
sentToPeer: make(map[u.Key]time.Time),
} }
} }
...@@ -40,6 +41,10 @@ type ledger struct { ...@@ -40,6 +41,10 @@ type ledger struct {
// wantList is a (bounded, small) set of keys that Partner desires. // wantList is a (bounded, small) set of keys that Partner desires.
wantList keySet wantList keySet
// sentToPeer is a set of keys to ensure we dont send duplicate blocks
// to a given peer
sentToPeer map[u.Key]time.Time
Strategy strategyFunc Strategy strategyFunc
} }
......
...@@ -10,6 +10,8 @@ import ( ...@@ -10,6 +10,8 @@ import (
u "github.com/jbenet/go-ipfs/util" u "github.com/jbenet/go-ipfs/util"
) )
const resendTimeoutPeriod = time.Minute
var log = u.Logger("strategy") var log = u.Logger("strategy")
// TODO niceness should be on a per-peer basis. Use-case: Certain peers are // TODO niceness should be on a per-peer basis. Use-case: Certain peers are
...@@ -65,9 +67,25 @@ func (s *strategist) ShouldSendBlockToPeer(k u.Key, p peer.Peer) bool { ...@@ -65,9 +67,25 @@ func (s *strategist) ShouldSendBlockToPeer(k u.Key, p peer.Peer) bool {
defer s.lock.RUnlock() defer s.lock.RUnlock()
ledger := s.ledger(p) ledger := s.ledger(p)
// Dont resend blocks within a certain time period
t, ok := ledger.sentToPeer[k]
if ok && t.Add(resendTimeoutPeriod).After(time.Now()) {
log.Error("Prevented block resend!")
return false
}
return ledger.ShouldSend() return ledger.ShouldSend()
} }
func (s *strategist) BlockSentToPeer(k u.Key, p peer.Peer) {
s.lock.Lock()
defer s.lock.Unlock()
ledger := s.ledger(p)
ledger.sentToPeer[k] = time.Now()
}
func (s *strategist) Seed(int64) { func (s *strategist) Seed(int64) {
s.lock.Lock() s.lock.Lock()
defer s.lock.Unlock() defer s.lock.Unlock()
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论