Skip to content

Commit 1f812ec

Browse files
committed
dnsx/cacher: fill err in summary when in hangover
1 parent 95ba12e commit 1f812ec

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

intra/dnsx/cacher.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const (
4747
var (
4848
errNoQuestion = errors.New("no question")
4949
errNoAnswer = errors.New("no answer")
50+
errHangover = errors.New("no connectivity")
5051
errCacheResponseEmpty = errors.New("empty cache response")
5152
errCacheResponseMismatch = errors.New("cache response mismatch")
5253
)
@@ -328,7 +329,6 @@ func (t *ctransport) fetch(network string, q []byte, msg *dns.Msg, summary *x.DN
328329
return &cres{ans: xdns.AsMsg(ans), s: copySummary(fsmm)}, qerr
329330
})
330331

331-
trok := t.hangover.Within(ttl10s)
332332
cachedres, fresh := cb.freshCopy(key) // always prefer value from cache
333333
if cachedres == nil { // use barrier response
334334
cachedres = v.Val.copy() // never nil, even on errs; but cres.ans may be nil
@@ -337,17 +337,27 @@ func (t *ctransport) fetch(network string, q []byte, msg *dns.Msg, summary *x.DN
337337
log.W("cache: barrier: stale(k: %s); barrier: %s (cache: %s)", key, v.String(), cachedres.String())
338338
}
339339

340-
if !trok {
340+
// if there's no network connectivity (in hangover for 10s) don't
341+
// return cached/barriered response, instead return an error
342+
if !t.hangover.Within(ttl10s) {
341343
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
344+
err := errors.Join(v.Err, errHangover)
345+
// retain upstream
346+
fsmm.Server = cachedres.s.Server
347+
fsmm.RelayServer = cachedres.s.RelayServer
348+
// retain query
349+
fsmm.QName = cachedres.s.QName
350+
fsmm.QType = cachedres.s.QType
351+
// mimic send fail
352+
fsmm.Msg = err.Error()
353+
fsmm.RCode = dns.RcodeServerFailure
354+
fsmm.Status = SendFailed
355+
return nil, err
346356
}
347357

348358
fres, cachedsmm, ferr := asResponse(msg, cachedres, true)
349359
// fill summary regardless of errors
350-
fillSummary(cachedsmm, fsmm) // cachedsmm may be equal to finalsumm
360+
fillSummary(cachedsmm, fsmm) // cachedsmm may itself be fsmm
351361

352362
return fres, errors.Join(v.Err, ferr)
353363
}

0 commit comments

Comments
 (0)