Skip to content

Commit

Permalink
Merge pull request ipfs/go-bitswap#284 from ipfs/feat/dont-have-new-p…
Browse files Browse the repository at this point in the history
…eers

Simulate DONT_HAVE when peer doesn't respond to want-block (new peers)

This commit was moved from ipfs/go-bitswap@3a82e57
  • Loading branch information
Stebalien committed Mar 10, 2020
2 parents cfd5219 + c863614 commit a1ea260
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 16 deletions.
2 changes: 1 addition & 1 deletion bitswap/bitswap.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ func New(parent context.Context, network bsnet.BitSwapNetwork,
var wm *bswm.WantManager
// onDontHaveTimeout is called when a want-block is sent to a peer that
// has an old version of Bitswap that doesn't support DONT_HAVE messages,
// and no response is received within a timeout.
// or when no response is received within a timeout.
onDontHaveTimeout := func(p peer.ID, dontHaves []cid.Cid) {
// Simulate a DONT_HAVE message arriving to the WantManager
wm.ReceiveFrom(ctx, p, nil, nil, dontHaves)
Expand Down
5 changes: 3 additions & 2 deletions bitswap/internal/messagequeue/donthavetimeoutmgr.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import (

const (
// dontHaveTimeout is used to simulate a DONT_HAVE when communicating with
// a peer whose Bitswap client doesn't support the DONT_HAVE response.
// a peer whose Bitswap client doesn't support the DONT_HAVE response,
// or when the peer takes too long to respond.
// If the peer doesn't respond to a want-block within the timeout, the
// local node assumes that the peer doesn't have the block.
dontHaveTimeout = 5 * time.Second
Expand Down Expand Up @@ -45,7 +46,7 @@ type pendingWant struct {

// dontHaveTimeoutMgr pings the peer to measure latency. It uses the latency to
// set a reasonable timeout for simulating a DONT_HAVE message for peers that
// don't support DONT_HAVE
// don't support DONT_HAVE or that take to long to respond.
type dontHaveTimeoutMgr struct {
ctx context.Context
shutdown func()
Expand Down
18 changes: 6 additions & 12 deletions bitswap/internal/messagequeue/messagequeue.go
Original file line number Diff line number Diff line change
Expand Up @@ -392,10 +392,8 @@ func (mq *MessageQueue) sendMessage() {
}

// Make sure the DONT_HAVE timeout manager has started
if !mq.sender.SupportsHave() {
// Note: Start is idempotent
mq.dhTimeoutMgr.Start()
}
// Note: Start is idempotent
mq.dhTimeoutMgr.Start()

// Convert want lists to a Bitswap Message
message, onSent := mq.extractOutgoingMessage(mq.sender.SupportsHave())
Expand Down Expand Up @@ -425,15 +423,11 @@ func (mq *MessageQueue) sendMessage() {
}
}

// If the peer is running an older version of Bitswap that doesn't support the
// DONT_HAVE response, watch for timeouts on any want-blocks we sent the peer,
// and if there is a timeout simulate a DONT_HAVE response.
// If want-block times out, simulate a DONT_HAVE reponse.
// This is necessary when making requests to peers running an older version of
// Bitswap that doesn't support the DONT_HAVE response, and is also useful to
// mitigate getting blocked by a peer that takes a long time to respond.
func (mq *MessageQueue) simulateDontHaveWithTimeout(msg bsmsg.BitSwapMessage) {
// If the peer supports DONT_HAVE responses, we don't need to simulate
if mq.sender.SupportsHave() {
return
}

mq.wllock.Lock()

// Get the CID of each want-block that expects a DONT_HAVE response
Expand Down
2 changes: 1 addition & 1 deletion bitswap/internal/session/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ func (s *Session) broadcastWantHaves(ctx context.Context, wants []cid.Cid) {
// Search for providers who have the first want in the list.
// Typically if the provider has the first block they will have
// the rest of the blocks also.
log.Warnf("Ses%d: FindMorePeers with want %s (1st of %d wants)", s.id, lu.C(wants[0]), len(wants))
log.Infof("Ses%d: FindMorePeers with want %s (1st of %d wants)", s.id, lu.C(wants[0]), len(wants))
s.findMorePeers(ctx, wants[0])
}
s.resetIdleTick()
Expand Down

0 comments on commit a1ea260

Please sign in to comment.