|
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