Move PluginCache before PluginCacheResponse

This commit is contained in:
Frank Denis 2019-11-24 09:14:36 +01:00
parent 6e3916556f
commit 1152491b2d
1 changed files with 76 additions and 72 deletions

View File

@ -23,62 +23,30 @@ type CachedResponses struct {
var cachedResponses CachedResponses var cachedResponses CachedResponses
type PluginCacheResponse struct { func computeCacheKey(pluginsState *PluginsState, msg *dns.Msg) ([32]byte, error) {
cachedResponses *CachedResponses questions := msg.Question
} if len(questions) != 1 {
return [32]byte{}, errors.New("No question present")
func (plugin *PluginCacheResponse) Name() string {
return "cache_response"
}
func (plugin *PluginCacheResponse) Description() string {
return "DNS cache (writer)."
}
func (plugin *PluginCacheResponse) Init(proxy *Proxy) error {
return nil
}
func (plugin *PluginCacheResponse) Drop() error {
return nil
}
func (plugin *PluginCacheResponse) Reload() error {
return nil
}
func (plugin *PluginCacheResponse) Eval(pluginsState *PluginsState, msg *dns.Msg) error {
plugin.cachedResponses = &cachedResponses
if msg.Rcode != dns.RcodeSuccess && msg.Rcode != dns.RcodeNameError && msg.Rcode != dns.RcodeNotAuth {
return nil
} }
if msg.Truncated { question := questions[0]
return nil h := sha512.New512_256()
var tmp [5]byte
binary.LittleEndian.PutUint16(tmp[0:2], question.Qtype)
binary.LittleEndian.PutUint16(tmp[2:4], question.Qclass)
if pluginsState.dnssec {
tmp[4] = 1
} }
cacheKey, err := computeCacheKey(pluginsState, msg) h.Write(tmp[:])
if err != nil { normalizedName := []byte(question.Name)
return err NormalizeName(&normalizedName)
} h.Write(normalizedName)
ttl := getMinTTL(msg, pluginsState.cacheMinTTL, pluginsState.cacheMaxTTL, pluginsState.cacheNegMinTTL, pluginsState.cacheNegMaxTTL) var sum [32]byte
cachedResponse := CachedResponse{ h.Sum(sum[:0])
expiration: time.Now().Add(ttl), return sum, nil
msg: *msg,
}
plugin.cachedResponses.Lock()
if plugin.cachedResponses.cache == nil {
plugin.cachedResponses.cache, err = lru.NewARC(pluginsState.cacheSize)
if err != nil {
plugin.cachedResponses.Unlock()
return err
}
}
plugin.cachedResponses.cache.Add(cacheKey, cachedResponse)
plugin.cachedResponses.Unlock()
updateTTL(msg, cachedResponse.expiration)
return nil
} }
// ---
type PluginCache struct { type PluginCache struct {
cachedResponses *CachedResponses cachedResponses *CachedResponses
} }
@ -137,24 +105,60 @@ func (plugin *PluginCache) Eval(pluginsState *PluginsState, msg *dns.Msg) error
return nil return nil
} }
func computeCacheKey(pluginsState *PluginsState, msg *dns.Msg) ([32]byte, error) { // ---
questions := msg.Question
if len(questions) != 1 { type PluginCacheResponse struct {
return [32]byte{}, errors.New("No question present") cachedResponses *CachedResponses
} }
question := questions[0]
h := sha512.New512_256() func (plugin *PluginCacheResponse) Name() string {
var tmp [5]byte return "cache_response"
binary.LittleEndian.PutUint16(tmp[0:2], question.Qtype) }
binary.LittleEndian.PutUint16(tmp[2:4], question.Qclass)
if pluginsState.dnssec { func (plugin *PluginCacheResponse) Description() string {
tmp[4] = 1 return "DNS cache (writer)."
} }
h.Write(tmp[:])
normalizedName := []byte(question.Name) func (plugin *PluginCacheResponse) Init(proxy *Proxy) error {
NormalizeName(&normalizedName) return nil
h.Write(normalizedName) }
var sum [32]byte
h.Sum(sum[:0]) func (plugin *PluginCacheResponse) Drop() error {
return sum, nil return nil
}
func (plugin *PluginCacheResponse) Reload() error {
return nil
}
func (plugin *PluginCacheResponse) Eval(pluginsState *PluginsState, msg *dns.Msg) error {
plugin.cachedResponses = &cachedResponses
if msg.Rcode != dns.RcodeSuccess && msg.Rcode != dns.RcodeNameError && msg.Rcode != dns.RcodeNotAuth {
return nil
}
if msg.Truncated {
return nil
}
cacheKey, err := computeCacheKey(pluginsState, msg)
if err != nil {
return err
}
ttl := getMinTTL(msg, pluginsState.cacheMinTTL, pluginsState.cacheMaxTTL, pluginsState.cacheNegMinTTL, pluginsState.cacheNegMaxTTL)
cachedResponse := CachedResponse{
expiration: time.Now().Add(ttl),
msg: *msg,
}
plugin.cachedResponses.Lock()
if plugin.cachedResponses.cache == nil {
plugin.cachedResponses.cache, err = lru.NewARC(pluginsState.cacheSize)
if err != nil {
plugin.cachedResponses.Unlock()
return err
}
}
plugin.cachedResponses.cache.Add(cacheKey, cachedResponse)
plugin.cachedResponses.Unlock()
updateTTL(msg, cachedResponse.expiration)
return nil
} }