@@ -50,7 +50,7 @@ const maxRetryCount = 3
50
50
type retrier struct {
51
51
dialers []protect.RDialer
52
52
dialerOpts settings.DialerOpts
53
- racing bool
53
+ multidial bool
54
54
raddr net.Addr
55
55
laddr net.Addr // laddr may be nil; TCPAddr.IP may be nil.
56
56
@@ -114,6 +114,14 @@ func (r *retrier) retryCompleted() bool {
114
114
return closed (r .retryDoneCh )
115
115
}
116
116
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
+
117
125
// Given rtt of a successful socket connection (SYN sent - SYNACK received),
118
126
// returns a timeout for replies to the first segment sent on this socket.
119
127
func calcTimeout (rtt time.Duration ) time.Duration {
@@ -154,11 +162,11 @@ func dialerOptsForRace() settings.DialerOpts {
154
162
}
155
163
}
156
164
157
- func DialRace (ds []protect.RDialer , laddr , raddr net.Addr ) (* retrier , error ) {
165
+ func DialAny (ds []protect.RDialer , laddr , raddr net.Addr ) (* retrier , error ) {
158
166
r := & retrier {
159
167
dialers : ds ,
160
168
dialerOpts : dialerOptsForRace (),
161
- racing : true ,
169
+ multidial : true ,
162
170
laddr : laddr , // may be nil
163
171
raddr : raddr , // must not be nil
164
172
retryDoneCh : make (chan struct {}),
@@ -271,8 +279,8 @@ func (r *retrier) dialLocked() (c core.DuplexConn, err error) {
271
279
r .conn = c // c may be nil
272
280
r .timeout = calcTimeout (rtt )
273
281
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 )
276
284
277
285
return
278
286
}
@@ -314,8 +322,8 @@ func (r *retrier) retryWriteReadLocked(buf []byte) (int, error) {
314
322
315
323
var nw int
316
324
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 )
319
327
if r .retryErr != nil {
320
328
return 0 , r .retryErr
321
329
}
@@ -338,8 +346,8 @@ func (r *retrier) retryWriteReadLocked(buf []byte) (int, error) {
338
346
_ = newConn .SetWriteDeadline (r .writeDeadline )
339
347
}
340
348
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 ())
343
351
344
352
return newConn .Read (buf )
345
353
}
@@ -378,20 +386,16 @@ func (r *retrier) Read(buf []byte) (n int, err error) {
378
386
if ! r .retryCompleted () {
379
387
defer close (r .retryDoneCh ) // signal that retry is complete or unnecessary
380
388
var retryerr error
381
- canRetry := r .retryCount < maxRetryCount
382
- if r .racing {
383
- canRetry = r .dialerCount < len (r .dialers )
384
- }
385
389
// retry on errs like timeouts or connection resets
386
- for (c == nil || err != nil ) && canRetry {
390
+ for (c == nil || err != nil ) && r . canRetryLocked () {
387
391
r .retryCount ++
388
392
n , retryerr = r .retryWriteReadLocked (buf )
389
393
c = r .conn // re-assign c to newConn, if any; may be nil
390
394
if c == nil {
391
395
err = core .UniqErr (err , retryerr )
392
396
}
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 )
395
399
}
396
400
if c != nil && core .IsNotNil (c ) {
397
401
_ = c .SetReadDeadline (r .readDeadline )
0 commit comments