提交 39162f2c 作者: Jeromy

prevent sending of same block to a peer twice

上级 6d488bd9
......@@ -307,6 +307,7 @@ func (bs *bitswap) ReceiveMessage(ctx context.Context, p peer.Peer, incoming bsm
blkmsg.AddBlock(block)
bs.send(ctx, p, blkmsg)
bs.strategy.BlockSentToPeer(block.Key(), p)
}
}
}
......
......@@ -32,6 +32,8 @@ type Strategy interface {
NumBytesReceivedFrom(peer.Peer) uint64
BlockSentToPeer(u.Key, peer.Peer)
// Values determining bitswap behavioural patterns
GetBatchSize() int
GetRebroadcastDelay() time.Duration
......
......@@ -13,9 +13,10 @@ type keySet map[u.Key]struct{}
func newLedger(p peer.Peer, strategy strategyFunc) *ledger {
return &ledger{
wantList: keySet{},
Strategy: strategy,
Partner: p,
wantList: keySet{},
Strategy: strategy,
Partner: p,
sentToPeer: make(map[u.Key]struct{}),
}
}
......@@ -40,6 +41,10 @@ type ledger struct {
// wantList is a (bounded, small) set of keys that Partner desires.
wantList keySet
// sentToPeer is a set of keys to ensure we dont send duplicate blocks
// to a given peer
sentToPeer map[u.Key]struct{}
Strategy strategyFunc
}
......
......@@ -65,9 +65,23 @@ func (s *strategist) ShouldSendBlockToPeer(k u.Key, p peer.Peer) bool {
defer s.lock.RUnlock()
ledger := s.ledger(p)
// Dont resend blocks
if _, ok := ledger.sentToPeer[k]; ok {
return false
}
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] = struct{}{}
}
func (s *strategist) Seed(int64) {
s.lock.Lock()
defer s.lock.Unlock()
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论