@@ -80,7 +80,7 @@ type ctransport struct {
80
80
bumps int // max bumps in lifetime of a cached response
81
81
size int // max size of a cache bucket
82
82
reqbarrier * core.Barrier [* cres ] // coalesce requests for the same query
83
- hangover * core.Hangover // hangover for the transport
83
+ hangover * core.Hangover // tracks send failure threshold
84
84
est core.P2QuantileEstimator
85
85
}
86
86
@@ -306,13 +306,22 @@ func (t *ctransport) Type() string {
306
306
return t .Transport .Type ()
307
307
}
308
308
309
+ func (t * ctransport ) hangoverCheckpoint () {
310
+ if t .Status () == SendFailed {
311
+ t .hangover .Note ()
312
+ } else {
313
+ t .hangover .Break ()
314
+ }
315
+ }
316
+
309
317
func (t * ctransport ) fetch (network string , q []byte , msg * dns.Msg , summary * x.DNSSummary , cb * cache , key string ) (r []byte , err error ) {
310
318
sendRequest := func (fsmm * x.DNSSummary ) ([]byte , error ) {
311
319
fsmm .ID = t .Transport .ID ()
312
320
fsmm .Type = t .Transport .Type ()
313
321
314
322
v , _ := t .reqbarrier .Do (key , func () (* cres , error ) {
315
323
ans , qerr := Req (t .Transport , network , q , fsmm )
324
+ t .hangoverCheckpoint ()
316
325
// cb.put no-ops when len(ans) is 0
317
326
cb .put (key , ans , fsmm )
318
327
// cres.ans may be nil
@@ -339,12 +348,7 @@ func (t *ctransport) fetch(network string, q []byte, msg *dns.Msg, summary *x.DN
339
348
// no network connectivity but cache returns proper responses to queries,
340
349
// which results in confused apps that think there's network connectivity,
341
350
// that is, these confused apps go bezerk resulting in battery drain.
342
- if t .Status () == SendFailed {
343
- t .hangover .Start ()
344
- } else {
345
- t .hangover .Stop ()
346
- }
347
- // 10s hasn't elapsed since the first send failure
351
+ // has 10s elapsed since the first send failure
348
352
trok := t .hangover .Within (ttl10s )
349
353
350
354
if v , isfresh := cb .freshCopy (key ); trok && v != nil {
0 commit comments