Commit 13ab516c authored by Jeromy's avatar Jeromy

prevent sending of same block to a peer twice

parent ccf6d93b
......@@ -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 is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment