Skip to content

Commit 95ba12e

Browse files
committed
dnsx/cacher: discard cache/barrier ans when in hangover
1 parent 68f9857 commit 95ba12e

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

intra/dnsx/cacher.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,12 +328,21 @@ func (t *ctransport) fetch(network string, q []byte, msg *dns.Msg, summary *x.DN
328328
return &cres{ans: xdns.AsMsg(ans), s: copySummary(fsmm)}, qerr
329329
})
330330

331+
trok := t.hangover.Within(ttl10s)
331332
cachedres, fresh := cb.freshCopy(key) // always prefer value from cache
332333
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())
335336
} 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
337346
}
338347

339348
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
354363
if v, isfresh := cb.freshCopy(key); trok && v != nil {
355364
var cachedsummary *x.DNSSummary
356365

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())
358367
r, cachedsummary, err = asResponse(msg, v, isfresh) // return cached response, may be stale
359368
if err != nil {
360369
log.W("cache: hit(k: %s) %s, but err? %v", key, v.str(), err)

0 commit comments

Comments
 (0)