@@ -328,12 +328,21 @@ func (t *ctransport) fetch(network string, q []byte, msg *dns.Msg, summary *x.DN
328
328
return & cres {ans : xdns .AsMsg (ans ), s : copySummary (fsmm )}, qerr
329
329
})
330
330
331
+ trok := t .hangover .Within (ttl10s )
331
332
cachedres , fresh := cb .freshCopy (key ) // always prefer value from cache
332
333
if cachedres == nil { // use barrier response
333
- cachedres = v .Val // never nil, even on errs; but cres.ans may be nil
334
- log .D ("cache: barrier: empty(%s); %s; typecast? %t " , key , cachedres )
334
+ cachedres = v .Val . copy () // never nil, even on errs; but cres.ans may be nil
335
+ log .D ("cache: barrier: empty(k: %s); barrier: %s " , key , v . String () )
335
336
} else if ! fresh { // expect fresh values, except on verrs
336
- log .W ("cache: barrier: stale(%s); barrier: %s (cache: %s)" , key , v .String (), cachedres .String ())
337
+ log .W ("cache: barrier: stale(k: %s); barrier: %s (cache: %s)" , key , v .String (), cachedres .String ())
338
+ }
339
+
340
+ if ! trok {
341
+ log .D ("cache: barrier: hangover(k: %s); discard ans" , key )
342
+ // if there's no network connectivity (in hangover) don't
343
+ // return cached/barriered response; though, leave cachedres.s
344
+ // intact as it is used to fill in fsmm (see: asResponse)
345
+ cachedres .ans = nil
337
346
}
338
347
339
348
fres , cachedsmm , ferr := asResponse (msg , cachedres , true )
@@ -354,7 +363,7 @@ func (t *ctransport) fetch(network string, q []byte, msg *dns.Msg, summary *x.DN
354
363
if v , isfresh := cb .freshCopy (key ); trok && v != nil {
355
364
var cachedsummary * x.DNSSummary
356
365
357
- log .D ("cache: hit(k: %s / stale? %t): %s, but stale? %t " , key , ! isfresh , v .str ())
366
+ log .D ("cache: hit(k: %s / stale? %t): %s" , key , ! isfresh , v .str ())
358
367
r , cachedsummary , err = asResponse (msg , v , isfresh ) // return cached response, may be stale
359
368
if err != nil {
360
369
log .W ("cache: hit(k: %s) %s, but err? %v" , key , v .str (), err )
0 commit comments