diff options
author | 2022-05-02 19:16:33 +0200 | |
---|---|---|
committer | 2022-05-02 13:16:33 -0400 | |
commit | 66f2ac7568ccb0178cc9ce6dbd7320bcd3428d64 (patch) | |
tree | 0eb7a1a25907a398f1d3d647c4895749b4908803 /plugin/cache/handler.go | |
parent | c3572fdb30446b6e625113ee0329cc80810afd6a (diff) | |
download | coredns-66f2ac7568ccb0178cc9ce6dbd7320bcd3428d64.tar.gz coredns-66f2ac7568ccb0178cc9ce6dbd7320bcd3428d64.tar.zst coredns-66f2ac7568ccb0178cc9ce6dbd7320bcd3428d64.zip |
plugin/cache: Add refresh mode setting to serve_stale (#5131)
This PR adds an optional REFRESH_MODE parameter on the serve_stale configuration directive of the
cache plugin, which verifies that the upstream is still unavailable before returning stale entries.
Signed-off-by: Antoine Tollenaere <atollena@gmail.com>
Diffstat (limited to 'plugin/cache/handler.go')
-rw-r--r-- | plugin/cache/handler.go | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/plugin/cache/handler.go b/plugin/cache/handler.go index 2b4c89350..d5112fc69 100644 --- a/plugin/cache/handler.go +++ b/plugin/cache/handler.go @@ -35,19 +35,29 @@ func (c *Cache) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) ttl := 0 i := c.getIgnoreTTL(now, state, server) - if i != nil { - ttl = i.ttl(now) - } if i == nil { crr := &ResponseWriter{ResponseWriter: w, Cache: c, state: state, server: server, do: do} return c.doRefresh(ctx, state, crr) } + ttl = i.ttl(now) if ttl < 0 { - servedStale.WithLabelValues(server, c.zonesMetricLabel).Inc() + // serve stale behavior + if c.verifyStale { + crr := &ResponseWriter{ResponseWriter: w, Cache: c, state: state, server: server, do: do} + cw := newVerifyStaleResponseWriter(crr) + ret, err := c.doRefresh(ctx, state, cw) + if cw.refreshed { + return ret, err + } + } + // Adjust the time to get a 0 TTL in the reply built from a stale item. now = now.Add(time.Duration(ttl) * time.Second) - cw := newPrefetchResponseWriter(server, state, c) - go c.doPrefetch(ctx, state, cw, i, now) + if !c.verifyStale { + cw := newPrefetchResponseWriter(server, state, c) + go c.doPrefetch(ctx, state, cw, i, now) + } + servedStale.WithLabelValues(server, c.zonesMetricLabel).Inc() } else if c.shouldPrefetch(i, now) { cw := newPrefetchResponseWriter(server, state, c) go c.doPrefetch(ctx, state, cw, i, now) @@ -70,7 +80,7 @@ func (c *Cache) doPrefetch(ctx context.Context, state request.Request, cw *Respo } } -func (c *Cache) doRefresh(ctx context.Context, state request.Request, cw *ResponseWriter) (int, error) { +func (c *Cache) doRefresh(ctx context.Context, state request.Request, cw dns.ResponseWriter) (int, error) { if !state.Do() { setDo(state.Req) } |