试图理解代码流。插件顺序似乎是:https://github.com/coredns/coredns/blob/master/plugin.cfg
所以它的缓存比转发要早很多。如果存在Cache未命中,但Forward返回一个成功的DNS回复,我们在代码中添加了Cache条目-由于Cache插件在Forward之前运行,因此很奇怪。
我在缓存插件中看到:CoreDNS
// ServeDNS implements the plugin.Handler interface.
func (c *Cache) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error)
// getIgnoreTTL unconditionally returns an item if it exists in the cache.
i := c.getIgnoreTTL(now, state, server)
if i == nil {
// cache miss
crr := &ResponseWriter{ResponseWriter: w, Cache: c, state: state, server: server, do: do}
return c.doRefresh(ctx, state, crr)
}我猜ResponseWriter不会在缓存中添加任何条目,因为Forward还没有被调用-这是正确的吗?在forwarder插件中,我没有看到任何用于在缓存中添加DNS响应/结果条目的调用。在主转发解析DNS请求后,如何填充缓存?
发布于 2021-06-29 03:15:52
在插件/缓存/cache.go中,
func (w *ResponseWriter) WriteMsg(res *dns.Msg) error {}“重写”dns.ResponseWriter的WriteMsg(),因此在forward.go、when it calls w.WriteMsg(ret)中,结果将被写入缓存(通过缓存插件重写的WriteMsg() )。
与在doRefresh()中一样,它传入*ResponseWriter而不是*dns.ResponseWriter:https://github.com/coredns/coredns/blob/master/plugin/cache/handler.go#L73
https://stackoverflow.com/questions/66202118
复制相似问题