@@ -179,17 +179,27 @@ func (t *plus) Query(network string, q *dns.Msg, smm *x.DNSSummary) (ans *dns.Ms
179
179
return t .forward (network , q , smm , ord ... )
180
180
}
181
181
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 )
184
186
tries := plusMaxTries
185
187
visited := make (map [string ]struct {}, len (all ))
188
+ var curSmm * x.DNSSummary
189
+
190
+ defer func () {
191
+ fillSummary (curSmm , outSmm )
192
+ }()
193
+
186
194
for _ , tr := range all {
195
+ curSmm = new (x.DNSSummary )
196
+
187
197
if len (visited ) > tries {
188
198
break
189
199
}
190
200
191
201
if tr == nil { // unlikely
192
- errs = append (errs , errNoSuchTransport )
202
+ errs = core . JoinErr (errs , errNoSuchTransport )
193
203
continue
194
204
}
195
205
@@ -202,19 +212,26 @@ func (t *plus) forward(network string, q *dns.Msg, smm *x.DNSSummary, all ...Tra
202
212
}
203
213
visited [id ] = struct {}{}
204
214
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
+
206
223
if err != nil {
207
- errs = append (errs , err )
224
+ errs = core . JoinErr (errs , err )
208
225
continue
209
226
}
210
- if xdns . IsServFailOrInvalid ( ans ) {
211
- errs = append (errs , errServFail )
227
+ if failed {
228
+ errs = core . JoinErr (errs , errServFail )
212
229
continue
213
230
}
214
- if ! xdns . HasAnyAnswer ( ans ) {
215
- errs = append (errs , errNoAnswer )
231
+ if noans {
232
+ errs = core . JoinErr (errs , errNoAnswer )
216
233
// wind down faster if multiple transports return no answer
217
- if len (visited ) >= tries / 2 {
234
+ if len (visited ) > tries / 2 {
218
235
return ans , nil
219
236
}
220
237
continue
@@ -225,7 +242,7 @@ func (t *plus) forward(network string, q *dns.Msg, smm *x.DNSSummary, all ...Tra
225
242
}
226
243
227
244
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
229
246
}
230
247
231
248
func (t * plus ) P50 () int64 {
@@ -339,3 +356,10 @@ func (t *plus) LiveTransports() string {
339
356
340
357
return strings .Join (ids , "," )
341
358
}
359
+
360
+ func loged (cond bool ) log.LogFn {
361
+ if cond {
362
+ return log .E
363
+ }
364
+ return log .D
365
+ }
0 commit comments