Skip to content

Commit 638dd32

Browse files
committed
dialers,auto: fix retry + rename vars
1 parent 546b9bf commit 638dd32

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

intra/dialers/retrier.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ const maxRetryCount = 3
5050
type 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.
119127
func 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)

intra/ipn/auto.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
const (
2323
ttl30s = 30 * time.Second
2424
shortdelay = 100 * time.Millisecond
25-
parallelDial = true
25+
parallelDial = false
2626
)
2727

2828
// exit is a proxy that always dials out to the internet.
@@ -134,13 +134,13 @@ func (h *auto) dial(network, local, remote string) (protect.Conn, error) {
134134

135135
remoteOnly := settings.AutoAlwaysRemote.Load()
136136

137-
if parallelDial {
137+
if !parallelDial {
138138
all := []protect.RDialer{exit, exit64, pro, warp, amz, sep}
139139
if remoteOnly {
140140
all = []protect.RDialer{pro, warp, amz, sep}
141141
}
142142
// TODO: pinning IPs
143-
return parallelDialStrat(all, network, local, remote)
143+
return dialAny(all, network, local, remote)
144144
}
145145

146146
previdx, recent := h.exp.Get(remote)

intra/ipn/proxies.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,8 +1489,8 @@ func localDialStrat(d *protect.RDial, network, local, remote string) (protect.Co
14891489
return dialers.SplitDialBind(d, network, local, remote)
14901490
}
14911491

1492-
func parallelDialStrat(all []protect.RDialer, network, local, remote string) (protect.Conn, error) {
1493-
return dialers.DialRace(all, str2addr(network, local), str2addr(network, remote))
1492+
func dialAny(all []protect.RDialer, network, local, remote string) (protect.Conn, error) {
1493+
return dialers.DialAny(all, str2addr(network, local), str2addr(network, remote))
14941494
}
14951495

14961496
func str2addr(network, addrport string) net.Addr {

0 commit comments

Comments
 (0)