Skip to content

Commit 8478aee

Browse files
committed
dnsx: add Cached field to Summary
1 parent fafb92d commit 8478aee

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

intra/backend/dnsx_listener.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ type DNSSummary struct {
2222
QName string
2323
// Query type: A, AAAA, SVCB, HTTPS, etc. May be 0.
2424
QType int
25+
// Cached response
26+
Cached bool
2527
// DNS Response data, ex: a csv of ips for A, AAAA.
2628
RData string
2729
// DNS Response code

intra/dnsx/alg.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ func (t *dnsgateway) cachedAnswer(tid string, q *dns.Msg, typ iptype) (ans *dns.
442442
func (t *dnsgateway) qp(t1 Transport, network string, q *dns.Msg, innersummary *x.DNSSummary) (ans *dns.Msg, err error) {
443443
// For A/AAAA queries, check if xips has an answer for the qname.
444444
if ans, err := t.cachedAnswer(idstr(t1), q, typreal); err == nil {
445+
innersummary.Cached = true
445446
return ans, nil
446447
}
447448
return Req(t1, network, q, innersummary)

intra/dnsx/cacher.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,16 @@ func (t *ctransport) fetch(network string, q *dns.Msg, summary *x.DNSSummary, cb
341341
fsmm.ID = t.ID()
342342
fsmm.Type = t.Type()
343343

344+
reqsent := false
345+
346+
defer func() {
347+
// fill after summaries are filled
348+
fsmm.Cached = !reqsent
349+
}()
350+
344351
cc := &cres{ans: nil, s: copySummary(fsmm)}
345352
v, err := t.reqbarrier.DoIt(key, func() (_ *cres, qerr error) {
353+
reqsent = true
346354
// ans may be nil
347355
cc.ans, qerr = Req(t.Transport, network, q, fsmm)
348356
t.hangoverCheckpoint()
@@ -355,11 +363,11 @@ func (t *ctransport) fetch(network string, q *dns.Msg, summary *x.DNSSummary, cb
355363
cachehit := cachedres != nil
356364
if !cachehit { // v.Val may be uncacheable (ex: rcode != 0)
357365
cachedres = cc.copy() // cc (cres) never nil; but cc.ans may be nil
358-
log.D("cache: barrier: empty(k: %s); barrier: %s; qerr? %v",
359-
key, v, err)
366+
log.D("cache: barrier: empty(k: %s); sent? %t; barrier: %s; qerr? %v",
367+
key, reqsent, v, err)
360368
} else if !fresh { // expect fresh values, except on verrs
361-
log.W("cache: barrier: stale(k: %s); barrier: %s (cache: %s); qerr? %v",
362-
key, v, cachedres, err)
369+
log.W("cache: barrier: stale(k: %s); sent? %t, barrier: %s (cache: %s); qerr? %v",
370+
key, reqsent, v, cachedres, err)
363371
}
364372

365373
// nil ans when Transport returns err (no servfail) and cache is empty
@@ -369,7 +377,8 @@ func (t *ctransport) fetch(network string, q *dns.Msg, summary *x.DNSSummary, cb
369377
inhangover := t.hangover.Exceeds(httl)
370378
if inhangover {
371379
err = core.JoinErr(err, errHangover)
372-
log.W("cache: barrier: hangover(k: %s); discard ans (has? %t)", key, hasans)
380+
log.W("cache: barrier: hangover(k: %s); sent? %t, discard ans (has? %t)",
381+
key, reqsent, hasans)
373382
if cachehit {
374383
fillSummary(cachedres.s, fsmm)
375384
}
@@ -431,6 +440,7 @@ func (t *ctransport) fetch(network string, q *dns.Msg, summary *x.DNSSummary, cb
431440
// change summary fields to reflect cached response, except for latency
432441
fillSummary(cachedsummary, summary)
433442
summary.Latency = 0 // don't use cached latency
443+
summary.Cached = true
434444
return r, nil
435445
} // else: fallthrough to sendRequest
436446
} else {
@@ -530,6 +540,7 @@ func fillSummary(s *x.DNSSummary, out *x.DNSSummary) {
530540
out.RData = s.RData
531541
}
532542

543+
out.Cached = s.Cached
533544
out.RCode = s.RCode
534545
out.RTtl = s.RTtl
535546
out.Server = s.Server

0 commit comments

Comments
 (0)