@@ -50,7 +50,7 @@ const maxRetryCount = 3
5050type retrier struct {
5151 dialers []protect.RDialer
5252 dialerOpts settings.DialerOpts
53- racing bool
53+ multidial bool
5454 raddr net.Addr
5555 laddr net.Addr // laddr may be nil; TCPAddr.IP may be nil.
5656
@@ -114,6 +114,14 @@ func (r *retrier) retryCompleted() bool {
114114 return closed (r .retryDoneCh )
115115}
116116
117+ func (r * retrier ) canRetryLocked () bool {
118+ if r .multidial {
119+ return r .dialerCount < len (r .dialers )
120+ } else {
121+ return r .retryCount < maxRetryCount
122+ }
123+ }
124+
117125// Given rtt of a successful socket connection (SYN sent - SYNACK received),
118126// returns a timeout for replies to the first segment sent on this socket.
119127func calcTimeout (rtt time.Duration ) time.Duration {
@@ -154,11 +162,11 @@ func dialerOptsForRace() settings.DialerOpts {
154162 }
155163}
156164
157- func DialRace (ds []protect.RDialer , laddr , raddr net.Addr ) (* retrier , error ) {
165+ func DialAny (ds []protect.RDialer , laddr , raddr net.Addr ) (* retrier , error ) {
158166 r := & retrier {
159167 dialers : ds ,
160168 dialerOpts : dialerOptsForRace (),
161- racing : true ,
169+ multidial : true ,
162170 laddr : laddr , // may be nil
163171 raddr : raddr , // must not be nil
164172 retryDoneCh : make (chan struct {}),
@@ -271,8 +279,8 @@ func (r *retrier) dialLocked() (c core.DuplexConn, err error) {
271279 r .conn = c // c may be nil
272280 r .timeout = calcTimeout (rtt )
273281
274- logeif (err )("retrier: dial(%s) %s=>%s; strat: %d (race ? %t), rtt: %dms; err? %v" ,
275- r .dialerOpts , laddr (c ), r .raddr , strat , r .racing , rtt .Milliseconds (), err )
282+ logeif (err )("retrier: dial(%s) %s=>%s; strat: %d (mult ? %t), rtt: %dms; err? %v" ,
283+ r .dialerOpts , laddr (c ), r .raddr , strat , r .multidial , rtt .Milliseconds (), err )
276284
277285 return
278286}
@@ -314,8 +322,8 @@ func (r *retrier) retryWriteReadLocked(buf []byte) (int, error) {
314322
315323 var nw int
316324 nw , r .retryErr = newConn .Write (r .tee )
317- logeif (r .retryErr )("retrier: retryLocked: strat(%s, racing ? %t) %s=>%s; write? %d/%d; err? %v" ,
318- r .dialerOpts , r .racing , laddr (newConn ), r .raddr , nw , len (r .tee ), r .retryErr )
325+ logeif (r .retryErr )("retrier: retryLocked: strat(%s, mult ? %t) %s=>%s; write? %d/%d; err? %v" ,
326+ r .dialerOpts , r .multidial , laddr (newConn ), r .raddr , nw , len (r .tee ), r .retryErr )
319327 if r .retryErr != nil {
320328 return 0 , r .retryErr
321329 }
@@ -338,8 +346,8 @@ func (r *retrier) retryWriteReadLocked(buf []byte) (int, error) {
338346 _ = newConn .SetWriteDeadline (r .writeDeadline )
339347 }
340348
341- logedcond (readdone || writedone )("retrier: retryLocked: done! strat(%s; racing ? %t) %s=>%s; write? %d/%d; closed r/w? %t/%t; deadline r/w: %v/%v" ,
342- r .dialerOpts , r .racing , laddr (newConn ), r .raddr , nw , len (r .tee ), readdone , writedone , time .Since (r .readDeadline ).Seconds (), time .Since (r .writeDeadline ).Seconds ())
349+ logedcond (readdone || writedone )("retrier: retryLocked: done! strat(%s; mult ? %t) %s=>%s; write? %d/%d; closed r/w? %t/%t; deadline r/w: %v/%v" ,
350+ r .dialerOpts , r .multidial , laddr (newConn ), r .raddr , nw , len (r .tee ), readdone , writedone , time .Since (r .readDeadline ).Seconds (), time .Since (r .writeDeadline ).Seconds ())
343351
344352 return newConn .Read (buf )
345353}
@@ -378,20 +386,16 @@ func (r *retrier) Read(buf []byte) (n int, err error) {
378386 if ! r .retryCompleted () {
379387 defer close (r .retryDoneCh ) // signal that retry is complete or unnecessary
380388 var retryerr error
381- canRetry := r .retryCount < maxRetryCount
382- if r .racing {
383- canRetry = r .dialerCount < len (r .dialers )
384- }
385389 // retry on errs like timeouts or connection resets
386- for (c == nil || err != nil ) && canRetry {
390+ for (c == nil || err != nil ) && r . canRetryLocked () {
387391 r .retryCount ++
388392 n , retryerr = r .retryWriteReadLocked (buf )
389393 c = r .conn // re-assign c to newConn, if any; may be nil
390394 if c == nil {
391395 err = core .UniqErr (err , retryerr )
392396 }
393- logeor (retryerr , log .I )("retrier: read# %d + (racing ? %t / c: %d): [%s<=%s] %d; err? %v" ,
394- r .retryCount , r .racing , r .dialerCount , laddr (c ), r .raddr , n , retryerr )
397+ logeor (retryerr , log .I )("retrier: read# %d + (mult ? %t / c: %d): [%s<=%s] %d; err? %v" ,
398+ r .retryCount , r .multidial , r .dialerCount , laddr (c ), r .raddr , n , retryerr )
395399 }
396400 if c != nil && core .IsNotNil (c ) {
397401 _ = c .SetReadDeadline (r .readDeadline )
0 commit comments