@@ -380,54 +380,51 @@ func (t *ctransport) fetch(network string, q *dns.Msg, smmout *x.DNSSummary, cb
380380 }
381381 }()
382382
383- cc := & cres {ans : nil , s : copySummary (smm2 )}
383+ ccx := & cres {ans : nil , s : copySummary (smm2 )}
384384 cc , err := t .reqbarrier .DoIt (key , func () (_ * cres , qerr error ) {
385385 reqsent = true
386386 // ans may be nil
387- cc .ans , qerr = Req (t .Transport , network , q , smm2 )
388- cc .s = copySummary (smm2 ) // copy summary to cc
387+ ccx .ans , qerr = Req (t .Transport , network , q , smm2 )
388+ ccx .s = copySummary (smm2 ) // copy summary to cc
389389 t .hangoverCheckpoint ()
390390 // cb.put no-ops when ans is nil or rcode != success (0)
391- cb .put (key , cc )
392- return cc , qerr
391+ cb .put (key , ccx )
392+ return ccx , qerr
393393 })
394394
395395 cachedres , fresh := cb .freshCopy (key ) // always prefer value from cache
396396 cachehit := cachedres != nil
397397 // nil ans when Transport returns err (no servfail) and cache is empty
398- hasans := cachedres != nil && cachedres .ans != nil
398+ cachedans := cachedres != nil && cachedres .ans != nil
399+
400+ // if there's no network connectivity (in hangover for 10s) don't
401+ // return cached/barriered response, instead return an error
402+ inhangover := t .hangover .Exceeds (httl )
399403
400404 // expect fresh values, except on verrs
401- logwif (! fresh )("cache: barrier: (k: %s) hit? %t / hasans ? %t / stale? %t; sent? %t, barrier: %s (cache: %s); qerr? %v" ,
402- key , cachehit , hasans , ! fresh , reqsent , cc , cachedres , err )
405+ logwif (cachehit && ! fresh || err != nil )("cache: barrier: (k: %s) hit? %t / hitans ? %t / stale? %t / sent? %t / hangover ? %t, barrier: %s (cache: %s); qerr? %v" ,
406+ key , cachehit , cachedans , ! fresh , reqsent , inhangover , cc , cachedres , err )
403407
404- if ! cachehit || ! hasans { // cc.Val may be uncacheable (ex: rcode != 0)
405- cachedres = cc . copy () // cc (cres) never nil; but cc.ans may be nil
408+ if ! cachehit || ! cachedans { // cc.Val may be uncacheable (ex: rcode != 0)
409+ cachedres = cc // cc (cres) never nil; but cc.ans may be nil
406410 }
407411
408- // if there's no network connectivity (in hangover for 10s) don't
409- // return cached/barriered response, instead return an error
410- inhangover := t .hangover .Exceeds (httl )
411412 if inhangover {
412413 err = core .JoinErr (err , errHangover )
413414 log .W ("cache: barrier: hangover(k: %s); sent? %t, discard ans (has? %t)" ,
414- key , reqsent , hasans )
415- if cachehit {
416- fillSummary (cachedres .s , smm2 )
417- }
415+ key , reqsent , cachedans )
416+ fillSummary (cachedres .s , smm2 )
418417 // mimic send fail
419418 smm2 .Msg = err .Error ()
420- smm2 .RCode = dns .RcodeServerFailure
419+ smm2 .RCode = dns .RcodeBadTime
421420 smm2 .Status = SendFailed
422421 // do not return any response (stall / drop silently)
423422 return nil , err
424423 }
425424
426425 // fres may be nil
427426 fres , cachedsmm , ferr := asResponse (q , cachedres , fresh )
428- if cachehit { // fill from cachedsmm despite any err if cache was hit
429- fillSummary (cachedsmm , smm2 ) // cachedsmm may itself be smm2
430- }
427+ fillSummary (cachedsmm , smm2 ) // cachedsmm may itself be smm2
431428
432429 return fres , core .JoinErr (err , ferr )
433430 }
@@ -504,7 +501,6 @@ func (t *ctransport) Query(network string, q *dns.Msg, smm *x.DNSSummary) (*dns.
504501 t .Unlock ()
505502
506503 response , err = t .fetch (network , q , smm , cb , key )
507-
508504 } else {
509505 err = errMissingQueryName // not really a transport error
510506 }
@@ -561,9 +557,6 @@ func fillSummary(s *x.DNSSummary, out *x.DNSSummary) {
561557 if out == nil || s == out {
562558 return
563559 }
564- if s == out {
565- return
566- }
567560
568561 // prefer out
569562
0 commit comments