Skip to content

Commit b324723

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

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

challenge/dns01/nameserver.go

Lines changed: 30 additions & 4 deletions
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,39 @@ 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 = 4 * bo.InitialInterval
242+
243+
operation := func() error {
244+
var err error
245+
in, err = sendDNSQuery(m, ns)
246+
247+
// errors from miekg/dns package and some errors from the net package must stop the retry.
248+
var e *dns.Error
249+
if err != nil &&
250+
(strings.Contains(err.Error(), "connection refused") || errors.As(err, &e)) {
251+
return backoff.Permanent(err)
252+
}
253+
254+
return err
255+
}
256+
257+
notify := func(err error, d time.Duration) {
258+
log.Infof("dnsQuery retry %v: fqdn=%s, ns=%s: %v", d, fqdn, ns, err)
259+
}
260+
261+
errG = backoff.RetryNotify(operation, bo, notify)
262+
if errG == nil && len(in.Answer) > 0 {
237263
break
238264
}
239265
}
240-
return in, err
266+
return in, errG
241267
}
242268

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

0 commit comments

Comments
 (0)