@@ -179,17 +179,27 @@ func (t *plus) Query(network string, q *dns.Msg, smm *x.DNSSummary) (ans *dns.Ms
179179 return t .forward (network , q , smm , ord ... )
180180}
181181
182- func (t * plus ) forward (network string , q * dns.Msg , smm * x.DNSSummary , all ... Transport ) (* dns.Msg , error ) {
183- var errs []error
182+ func (t * plus ) forward (network string , q * dns.Msg , outSmm * x.DNSSummary , all ... Transport ) (* dns.Msg , error ) {
183+ var errs error
184+ qname := qname (q )
185+ qtyp := qtype (q )
184186 tries := plusMaxTries
185187 visited := make (map [string ]struct {}, len (all ))
188+ var curSmm * x.DNSSummary
189+
190+ defer func () {
191+ fillSummary (curSmm , outSmm )
192+ }()
193+
186194 for _ , tr := range all {
195+ curSmm = new (x.DNSSummary )
196+
187197 if len (visited ) > tries {
188198 break
189199 }
190200
191201 if tr == nil { // unlikely
192- errs = append (errs , errNoSuchTransport )
202+ errs = core . JoinErr (errs , errNoSuchTransport )
193203 continue
194204 }
195205
@@ -202,19 +212,26 @@ func (t *plus) forward(network string, q *dns.Msg, smm *x.DNSSummary, all ...Tra
202212 }
203213 visited [id ] = struct {}{}
204214
205- ans , err := tr .Query (network , q , smm )
215+ ans , err := tr .Query (network , q , curSmm )
216+
217+ failed := xdns .IsServFailOrInvalid (ans )
218+ noans := ! failed && ! xdns .HasAnyAnswer (ans )
219+
220+ loged (err != nil || failed || noans )("plus: queried %s for %s:%d; data: %s, code: %d, err? %v" ,
221+ idstr (tr ), qname , qtyp , curSmm .RData , curSmm .RCode , err )
222+
206223 if err != nil {
207- errs = append (errs , err )
224+ errs = core . JoinErr (errs , err )
208225 continue
209226 }
210- if xdns . IsServFailOrInvalid ( ans ) {
211- errs = append (errs , errServFail )
227+ if failed {
228+ errs = core . JoinErr (errs , errServFail )
212229 continue
213230 }
214- if ! xdns . HasAnyAnswer ( ans ) {
215- errs = append (errs , errNoAnswer )
231+ if noans {
232+ errs = core . JoinErr (errs , errNoAnswer )
216233 // wind down faster if multiple transports return no answer
217- if len (visited ) >= tries / 2 {
234+ if len (visited ) > tries / 2 {
218235 return ans , nil
219236 }
220237 continue
@@ -225,7 +242,7 @@ func (t *plus) forward(network string, q *dns.Msg, smm *x.DNSSummary, all ...Tra
225242 }
226243
227244 log .W ("plus: [exp: %d / tried: %d]: all transports failed: %v" , len (all ), len (visited ), errs )
228- return nil , core . UniqErr ( errs ... )
245+ return nil , errs
229246}
230247
231248func (t * plus ) P50 () int64 {
@@ -339,3 +356,10 @@ func (t *plus) LiveTransports() string {
339356
340357 return strings .Join (ids , "," )
341358}
359+
360+ func loged (cond bool ) log.LogFn {
361+ if cond {
362+ return log .E
363+ }
364+ return log .D
365+ }
0 commit comments