Skip to content

Commit c38b027

Browse files
committed
dialers/retrier: est timeout first Write() waiting on first Read()
1 parent 8c59545 commit c38b027

1 file changed

Lines changed: 11 additions & 1 deletion

File tree

intra/dialers/retrier.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,17 @@ func (r *retrier) Write(b []byte) (int, error) {
513513
// by the retry procedure. Block until we have a final socket (which will
514514
// already have replayed r.tee), and retry.
515515
// ie, wait until first write is done on the final socket.
516-
<-r.retryDoneCh
516+
maxExpectedReadTimeout := r.timeout * maxRetryCount
517+
if r.multidial {
518+
maxExpectedReadTimeout = r.timeout * time.Duration(len(r.dialers))
519+
}
520+
select {
521+
case <-r.retryDoneCh:
522+
case <-time.After(3 * maxExpectedReadTimeout): // arb high timeout; it should rarely if ever needed
523+
log.W("retrier: write: 1st write timed-out waiting for %d [calc-rtt: %d] 1st read b/w [%s=>%s], mult: %d, n: %d, err: %v",
524+
3*maxExpectedReadTimeout, r.timeout, src, r.raddr, len(r.dialers), n, err)
525+
return n, core.JoinErr(err, errRetryTimeout)
526+
}
517527

518528
// if Write() does not wait for <-retryDoneCh in absence of errors,
519529
// it is possible that ReadFrom() => copyOnce() is called before retryDoneCh

0 commit comments

Comments
 (0)