From f97d0ac99418256ab4971d002ee807cfdf778453 Mon Sep 17 00:00:00 2001 From: Andrew Dunham Date: Thu, 2 May 2024 12:28:38 -0400 Subject: [PATCH] net/dns/resolver: add better error wrapping To aid in debugging exactly what's going wrong, instead of the not-particularly-useful "dns udp query: context deadline exceeded" error that we currently get. Updates #3786 Updates #10768 Updates #11620 (etc.) Signed-off-by: Andrew Dunham Change-Id: I76334bf0681a8a2c72c90700f636c4174931432c --- net/dns/resolver/forwarder.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/net/dns/resolver/forwarder.go b/net/dns/resolver/forwarder.go index 7484fe558..5822915e8 100644 --- a/net/dns/resolver/forwarder.go +++ b/net/dns/resolver/forwarder.go @@ -859,7 +859,7 @@ func (f *forwarder) forwardWithDestChan(ctx context.Context, query packet, respo } select { case <-ctx.Done(): - return ctx.Err() + return fmt.Errorf("waiting to send NXDOMAIN: %w", ctx.Err()) case responseChan <- res: return nil } @@ -885,7 +885,7 @@ func (f *forwarder) forwardWithDestChan(ctx context.Context, query packet, respo } select { case <-ctx.Done(): - return ctx.Err() + return fmt.Errorf("waiting to send SERVFAIL: %w", ctx.Err()) case responseChan <- res: return nil } @@ -915,6 +915,7 @@ func (f *forwarder) forwardWithDestChan(ctx context.Context, query packet, respo } resb, err := f.send(ctx, fq, *rr) if err != nil { + err = fmt.Errorf("resolving using %q: %w", rr.name.Addr, err) select { case errc <- err: case <-ctx.Done(): @@ -936,7 +937,7 @@ func (f *forwarder) forwardWithDestChan(ctx context.Context, query packet, respo select { case <-ctx.Done(): metricDNSFwdErrorContext.Add(1) - return ctx.Err() + return fmt.Errorf("waiting to send response: %w", ctx.Err()) case responseChan <- packet{v, query.family, query.addr}: metricDNSFwdSuccess.Add(1) return nil @@ -969,7 +970,16 @@ func (f *forwarder) forwardWithDestChan(ctx context.Context, query packet, respo metricDNSFwdErrorContextGotError.Add(1) return firstErr } - return ctx.Err() + + // If we haven't got an error or a successful response, + // include all resolvers in the error message so we can + // at least see what what servers we're trying to + // query. + var resolverAddrs []string + for _, rr := range resolvers { + resolverAddrs = append(resolverAddrs, rr.name.Addr) + } + return fmt.Errorf("waiting for response or error from %v: %w", resolverAddrs, ctx.Err()) } } }