|
8 | 8 | "sync" |
9 | 9 | "time" |
10 | 10 |
|
| 11 | + "github.com/cenkalti/backoff/v4" |
| 12 | + "github.com/go-acme/lego/v3/log" |
11 | 13 | "github.com/miekg/dns" |
12 | 14 | ) |
13 | 15 |
|
@@ -229,15 +231,31 @@ func dnsQuery(fqdn string, rtype uint16, nameservers []string, recursive bool) ( |
229 | 231 | m := createDNSMsg(fqdn, rtype, recursive) |
230 | 232 |
|
231 | 233 | var in *dns.Msg |
232 | | - var err error |
| 234 | + var errG error |
233 | 235 |
|
234 | 236 | for _, ns := range nameservers { |
235 | | - in, err = sendDNSQuery(m, ns) |
236 | | - if err == nil && len(in.Answer) > 0 { |
| 237 | + bo := backoff.NewExponentialBackOff() |
| 238 | + bo.Multiplier = 1.2 |
| 239 | + bo.InitialInterval = dnsTimeout |
| 240 | + bo.MaxInterval = 2 * bo.InitialInterval |
| 241 | + bo.MaxElapsedTime = 6 * bo.InitialInterval |
| 242 | + |
| 243 | + operation := func() error { |
| 244 | + var err error |
| 245 | + in, err = sendDNSQuery(m, ns) |
| 246 | + return err |
| 247 | + } |
| 248 | + |
| 249 | + notify := func(err error, d time.Duration) { |
| 250 | + log.Infof("dnsQuery retry %v: fqdn=%s, ns=%s: %v", d, fqdn, ns, err) |
| 251 | + } |
| 252 | + |
| 253 | + errG = backoff.RetryNotify(operation, bo, notify) |
| 254 | + if errG == nil && len(in.Answer) > 0 { |
237 | 255 | break |
238 | 256 | } |
239 | 257 | } |
240 | | - return in, err |
| 258 | + return in, errG |
241 | 259 | } |
242 | 260 |
|
243 | 261 | func createDNSMsg(fqdn string, rtype uint16, recursive bool) *dns.Msg { |
|
0 commit comments