diff options
author | 2018-04-01 14:23:40 +0100 | |
---|---|---|
committer | 2018-04-01 14:23:40 +0100 | |
commit | 5f98e98107e90f518f2e8d0ccdd2df7ab2497b7a (patch) | |
tree | d1c3904dedb031250ef1092cedced40d7c57c58f | |
parent | 2338120f5b8987abdeff12018473c7cef14eebf1 (diff) | |
download | coredns-5f98e98107e90f518f2e8d0ccdd2df7ab2497b7a.tar.gz coredns-5f98e98107e90f518f2e8d0ccdd2df7ab2497b7a.tar.zst coredns-5f98e98107e90f518f2e8d0ccdd2df7ab2497b7a.zip |
plugin/proxy: return client error (#1646)
Return the client error if there was one instead of the generic
"no healthy upstream or error"
-rw-r--r-- | plugin/forward/forward.go | 8 | ||||
-rw-r--r-- | plugin/forward/lookup.go | 7 |
2 files changed, 14 insertions, 1 deletions
diff --git a/plugin/forward/forward.go b/plugin/forward/forward.go index 34864d4a3..96b7e4c24 100644 --- a/plugin/forward/forward.go +++ b/plugin/forward/forward.go @@ -65,6 +65,7 @@ func (f *Forward) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg fails := 0 var span, child ot.Span + var upstreamErr error span = ot.SpanFromContext(ctx) for _, proxy := range f.list() { @@ -93,6 +94,7 @@ func (f *Forward) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg } ret, err = truncated(ret, err) + upstreamErr = err if err != nil { // Kick off health check to see if *our* upstream is broken. @@ -124,6 +126,10 @@ func (f *Forward) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg return 0, nil } + if upstreamErr != nil { + return dns.RcodeServerFailure, upstreamErr + } + return dns.RcodeServerFailure, errNoHealthy } @@ -155,7 +161,7 @@ func (f *Forward) list() []*Proxy { return f.p.List(f.proxies) } var ( errInvalidDomain = errors.New("invalid domain for forward") - errNoHealthy = errors.New("no healthy proxies or upstream error") + errNoHealthy = errors.New("no healthy proxies") errNoForward = errors.New("no forwarder defined") ) diff --git a/plugin/forward/lookup.go b/plugin/forward/lookup.go index b5a6b43d9..77df9b8a7 100644 --- a/plugin/forward/lookup.go +++ b/plugin/forward/lookup.go @@ -19,6 +19,7 @@ func (f *Forward) Forward(state request.Request) (*dns.Msg, error) { } fails := 0 + var upstreamErr error for _, proxy := range f.list() { if proxy.Down(f.maxfails) { fails++ @@ -33,6 +34,7 @@ func (f *Forward) Forward(state request.Request) (*dns.Msg, error) { ret, err := proxy.connect(context.Background(), state, f.forceTCP, true) ret, err = truncated(ret, err) + upstreamErr = err if err != nil { if fails < len(f.proxies) { @@ -48,6 +50,11 @@ func (f *Forward) Forward(state request.Request) (*dns.Msg, error) { return ret, err } + + if upstreamErr != nil { + return nil, upstreamErr + } + return nil, errNoHealthy } |