From e013577a4f07666440af54fe6982b89e0629a3a2 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Mon, 22 Apr 2019 16:05:41 -0700 Subject: [PATCH] peer: remove write backoff This commit removes the write backoff, since subsequent retries no longer need to access the write pool. Subsequent flushes will resume writing any partial writes that occurred before the timeout until the message is received or the idle write timer is triggered. In the future, we can add callbacks that execute on write events timeouts. This can be useful for mobile clients that might roam, as the timeout could indicate the connection is dead even if the OS has not reported it closed. The callback can be used then, for example, to initiate another outbound connection to test whether or not the issue is related to the connection. --- peer.go | 46 ++++------------------------------------------ 1 file changed, 4 insertions(+), 42 deletions(-) diff --git a/peer.go b/peer.go index 4832ddcb..e92574c7 100644 --- a/peer.go +++ b/peer.go @@ -1493,11 +1493,6 @@ func (p *peer) writeHandler() { var exitErr error - const ( - minRetryDelay = 5 * time.Second - maxRetryDelay = time.Minute - ) - out: for { select { @@ -1517,49 +1512,16 @@ out: // message. startTime := time.Now() - // Initialize a retry delay of zero, which will be - // increased if we encounter a write timeout on the - // send. - var retryDelay time.Duration - retryWithDelay: - if retryDelay > 0 { - select { - case <-time.After(retryDelay): - case <-p.quit: - // Inform synchronous writes that the - // peer is exiting. - if outMsg.errChan != nil { - outMsg.errChan <- ErrPeerExiting - } - exitErr = ErrPeerExiting - break out - } - } - + retry: // Write out the message to the socket. If a timeout // error is encountered, we will catch this and retry // after backing off in case the remote peer is just // slow to process messages from the wire. err := p.writeMessage(outMsg.msg) if nerr, ok := err.(net.Error); ok && nerr.Timeout() { - // Increase the retry delay in the event of a - // timeout error, this prevents us from - // disconnecting if the remote party is slow to - // pull messages off the wire. We back off - // exponentially up to our max delay to prevent - // blocking the write pool. - if retryDelay == 0 { - retryDelay = minRetryDelay - } else { - retryDelay *= 2 - if retryDelay > maxRetryDelay { - retryDelay = maxRetryDelay - } - } - peerLog.Debugf("Write timeout detected for "+ - "peer %s, retrying after %v, "+ - "first attempted %v ago", p, retryDelay, + "peer %s, first write for message "+ + "attempted %v ago", p, time.Since(startTime)) // If we received a timeout error, this implies @@ -1571,7 +1533,7 @@ out: // reserializing or reencrypting it. outMsg.msg = nil - goto retryWithDelay + goto retry } // The write succeeded, reset the idle timer to prevent