Skip to content

Commit ea60668

Browse files
committed
dnsx/cacher: treat barriered ans like cached ans
1 parent 07eacfd commit ea60668

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

intra/dnsx/cacher.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const (
4646
)
4747

4848
var (
49+
errNoQuestion = errors.New("no question")
4950
errCacheResponseEmpty = errors.New("empty cache response")
5051
errCacheResponseMismatch = errors.New("cache response mismatch")
5152
)
@@ -259,6 +260,10 @@ func (cb *cache) put(response []byte, s *Summary) (ok bool) {
259260
}
260261

261262
func asResponse(q *dns.Msg, v *cres, fresh bool) (r []byte, s *Summary, err error) {
263+
if q == nil {
264+
err = errNoQuestion
265+
return
266+
}
262267
a := v.ans
263268
if a == nil {
264269
err = errCacheResponseEmpty
@@ -294,37 +299,34 @@ func (t *ctransport) Type() string {
294299
return t.Transport.Type()
295300
}
296301

297-
type anssummary struct {
298-
ans []byte
299-
s *Summary
300-
}
301-
302302
func (t *ctransport) fetch(network string, q []byte, msg *dns.Msg, summary *Summary, cb *cache, key string) (r []byte, err error) {
303303
sendRequest := func(async bool) ([]byte, error) {
304-
var s *Summary
304+
var finalsumm *Summary
305305
if async {
306-
s = new(Summary)
306+
finalsumm = new(Summary)
307307
} else {
308-
s = summary
308+
finalsumm = summary
309309
}
310310

311-
s.ID = t.Transport.ID()
312-
s.Type = t.Transport.Type()
311+
finalsumm.ID = t.Transport.ID()
312+
finalsumm.Type = t.Transport.Type()
313313

314314
rv := t.reqbarrier.Do(key, func() (any, error) {
315-
ans, err := t.Transport.Query(network, q, s)
316-
cb.put(ans, s)
317-
return &anssummary{ans, s}, err
315+
ans, err := t.Transport.Query(network, q, finalsumm)
316+
cb.put(ans, finalsumm)
317+
return &cres{ans: xdns.AsMsg(ans), s: finalsumm}, err
318318
})
319319

320-
asmm, ok := rv.Val.(*anssummary)
320+
cachedres, ok := rv.Val.(*cres)
321321
if !ok {
322322
return nil, errCacheResponseMismatch
323323
}
324-
// fill summary regardless of rv.Err
325-
asmm.s.FillInto(s) // asmm.s may be equal to s
326324

327-
return asmm.ans, rv.Err
325+
finalres, origsumm, finalerr := asResponse(msg, cachedres, true)
326+
// fill summary regardless of errors
327+
origsumm.FillInto(finalsumm) // origsumm may be equal to s
328+
329+
return finalres, errors.Join(rv.Err, finalerr)
328330
}
329331

330332
// check if underlying transport can connect fine, if not treat cache

0 commit comments

Comments
 (0)