aboutsummaryrefslogtreecommitdiff
path: root/plugin/cache/cache.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/cache/cache.go')
-rw-r--r--plugin/cache/cache.go30
1 files changed, 14 insertions, 16 deletions
diff --git a/plugin/cache/cache.go b/plugin/cache/cache.go
index c46267658..654841b23 100644
--- a/plugin/cache/cache.go
+++ b/plugin/cache/cache.go
@@ -60,24 +60,24 @@ func New() *Cache {
// Return key under which we store the item, -1 will be returned if we don't store the
// message.
// Currently we do not cache Truncated, errors zone transfers or dynamic update messages.
-func key(m *dns.Msg, t response.Type, do bool) int {
+func key(m *dns.Msg, t response.Type, do bool) (bool, uint64) {
// We don't store truncated responses.
if m.Truncated {
- return -1
+ return false, 0
}
// Nor errors or Meta or Update
if t == response.OtherError || t == response.Meta || t == response.Update {
- return -1
+ return false, 0
}
- return int(hash(m.Question[0].Name, m.Question[0].Qtype, do))
+ return true, hash(m.Question[0].Name, m.Question[0].Qtype, do)
}
var one = []byte("1")
var zero = []byte("0")
-func hash(qname string, qtype uint16, do bool) uint32 {
- h := fnv.New32()
+func hash(qname string, qtype uint16, do bool) uint64 {
+ h := fnv.New64()
if do {
h.Write(one)
@@ -97,7 +97,7 @@ func hash(qname string, qtype uint16, do bool) uint32 {
h.Write([]byte{c})
}
- return h.Sum32()
+ return h.Sum64()
}
// ResponseWriter is a response writer that caches the reply message.
@@ -152,7 +152,7 @@ func (w *ResponseWriter) WriteMsg(res *dns.Msg) error {
}
// key returns empty string for anything we don't want to cache.
- key := key(res, mt, do)
+ hasKey, key := key(res, mt, do)
duration := w.pttl
if mt == response.NameError || mt == response.NoData {
@@ -164,7 +164,7 @@ func (w *ResponseWriter) WriteMsg(res *dns.Msg) error {
duration = msgTTL
}
- if key != -1 && duration > 0 {
+ if hasKey && duration > 0 {
if w.state.Match(res) {
w.set(res, key, mt, duration)
cacheSize.WithLabelValues(w.server, Success).Set(float64(w.pcache.Len()))
@@ -195,19 +195,17 @@ func (w *ResponseWriter) WriteMsg(res *dns.Msg) error {
return w.ResponseWriter.WriteMsg(res)
}
-func (w *ResponseWriter) set(m *dns.Msg, key int, mt response.Type, duration time.Duration) {
- if key == -1 || duration == 0 {
- return
- }
-
+func (w *ResponseWriter) set(m *dns.Msg, key uint64, mt response.Type, duration time.Duration) {
+ // duration is expected > 0
+ // and key is valid
switch mt {
case response.NoError, response.Delegation:
i := newItem(m, w.now(), duration)
- w.pcache.Add(uint32(key), i)
+ w.pcache.Add(key, i)
case response.NameError, response.NoData:
i := newItem(m, w.now(), duration)
- w.ncache.Add(uint32(key), i)
+ w.ncache.Add(key, i)
case response.OtherError:
// don't cache these