1 Commits
Author SHA1 Message Date
sneak c6f4c57d68 watcher: a lookup cut short by shutdown is not logged as an error (closes #229)
check / check (push) Canceled after 0s
Stopping dnswatcher during a DNS check logged every lookup the stop cut
short as an error, "context canceled". The four places in the watcher
that log a failed lookup now do it through logFailedLookup, which logs
nothing when the watcher's context was cancelled; the port and TLS
checks already return quietly. It asks the context, not the lookup's
error, because the resolver reports a cancelled lookup with its own
error, which does not wrap context.Canceled. A context whose deadline
passed is not cancelled, so a lookup that ran out of time is still
logged as an error. The tests run a check on a cancelled context and on
one whose deadline passed; neither sends a query.

Model: opus-5-5
2026-10-02 06:21:05 +00:00
+23 -16
View File
@@ -212,20 +212,33 @@ func (w *Watcher) runDNSChecks(ctx context.Context) {
} }
} }
// logFailedLookup logs a failed DNS lookup at error level, unless ctx
// was cancelled: shutdown cancels it, and a lookup it cut short did not
// fail. A lookup that ran out of time did fail, so it is logged.
func (w *Watcher) logFailedLookup(
ctx context.Context,
msg string,
args ...any,
) {
if errors.Is(ctx.Err(), context.Canceled) {
return
}
w.log.Error(msg, args...)
}
func (w *Watcher) checkDomain( func (w *Watcher) checkDomain(
ctx context.Context, ctx context.Context,
domain string, domain string,
) { ) {
nameservers, err := w.resolver.LookupNS(ctx, domain) nameservers, err := w.resolver.LookupNS(ctx, domain)
if err != nil { if err != nil {
// Shutdown cancels ctx; a lookup it cut short did not fail. w.logFailedLookup(
if !errors.Is(ctx.Err(), context.Canceled) { ctx,
w.log.Error(
"failed to lookup NS", "failed to lookup NS",
"domain", domain, "domain", domain,
"error", err, "error", err,
) )
}
return return
} }
@@ -261,14 +274,12 @@ func (w *Watcher) checkDomain(
// the domain's IP addresses. // the domain's IP addresses.
results, err := w.resolver.LookupAllRecords(ctx, domain) results, err := w.resolver.LookupAllRecords(ctx, domain)
if err != nil { if err != nil {
// Shutdown cancels ctx; a lookup it cut short did not fail. w.logFailedLookup(
if !errors.Is(ctx.Err(), context.Canceled) { ctx,
w.log.Error(
"failed to lookup records for domain", "failed to lookup records for domain",
"domain", domain, "domain", domain,
"error", err, "error", err,
) )
}
return return
} }
@@ -344,14 +355,12 @@ func (w *Watcher) resolveNameserverAddresses(
continue continue
} }
// Shutdown cancels ctx; a lookup it cut short did not fail. w.logFailedLookup(
if !errors.Is(ctx.Err(), context.Canceled) { ctx,
w.log.Error(
"no addresses found for nameserver", "no addresses found for nameserver",
"nameserver", ns, "nameserver", ns,
"error", err, "error", err,
) )
}
if prevIPs, ok := prev[ns]; ok { if prevIPs, ok := prev[ns]; ok {
addresses[ns] = prevIPs addresses[ns] = prevIPs
@@ -399,14 +408,12 @@ func (w *Watcher) checkHostname(
) { ) {
results, err := w.resolver.LookupAllRecords(ctx, hostname) results, err := w.resolver.LookupAllRecords(ctx, hostname)
if err != nil { if err != nil {
// Shutdown cancels ctx; a lookup it cut short did not fail. w.logFailedLookup(
if !errors.Is(ctx.Err(), context.Canceled) { ctx,
w.log.Error(
"failed to lookup records", "failed to lookup records",
"hostname", hostname, "hostname", hostname,
"error", err, "error", err,
) )
}
return return
} }