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 ...@@ -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
......
...@@ -13,9 +13,10 @@ type keySet map[u.Key]struct{} ...@@ -13,9 +13,10 @@ type keySet map[u.Key]struct{}
func newLedger(p peer.Peer, strategy strategyFunc) *ledger { func newLedger(p peer.Peer, strategy strategyFunc) *ledger {
return &ledger{ return &ledger{
wantList: keySet{}, wantList: keySet{},
Strategy: strategy, Strategy: strategy,
Partner: p, Partner: p,
sentToPeer: make(map[u.Key]struct{}),
} }
} }
...@@ -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]struct{}
Strategy strategyFunc Strategy strategyFunc
} }
......
...@@ -65,9 +65,23 @@ func (s *strategist) ShouldSendBlockToPeer(k u.Key, p peer.Peer) bool { ...@@ -65,9 +65,23 @@ 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
if _, ok := ledger.sentToPeer[k]; ok {
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] = struct{}{}
}
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 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