Skip to content

Commit c44e405

Browse files
committed
feat: retry on DNS queries.
1 parent 0349e40 commit c44e405

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

challenge/dns01/nameserver.go

+22-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"sync"
99
"time"
1010

11+
"github.com/cenkalti/backoff/v4"
12+
"github.com/go-acme/lego/v3/log"
1113
"github.com/miekg/dns"
1214
)
1315

@@ -229,15 +231,31 @@ func dnsQuery(fqdn string, rtype uint16, nameservers []string, recursive bool) (
229231
m := createDNSMsg(fqdn, rtype, recursive)
230232

231233
var in *dns.Msg
232-
var err error
234+
var errG error
233235

234236
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 {
237255
break
238256
}
239257
}
240-
return in, err
258+
return in, errG
241259
}
242260

243261
func createDNSMsg(fqdn string, rtype uint16, recursive bool) *dns.Msg {

0 commit comments

Comments
 (0)