@@ -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