aboutsummaryrefslogtreecommitdiff
path: root/plugin/cache/cache.go
diff options
context:
space:
mode:
authorGravatar Francois Tur <ftur@infoblox.com> 2018-08-31 17:26:43 -0400
committerGravatar Yong Tang <yong.tang.github@outlook.com> 2018-08-31 14:26:43 -0700
commit4c6c9d4b2700c3e4606d4b98bde64e7c1ed0c231 (patch)
tree628c776c0d6e7211b7e648a99303115e0f1f1a72 /plugin/cache/cache.go
parentd00e8c39183b0385324bc7ea56a3f2aeb6918748 (diff)
downloadcoredns-4c6c9d4b2700c3e4606d4b98bde64e7c1ed0c231.tar.gz
coredns-4c6c9d4b2700c3e4606d4b98bde64e7c1ed0c231.tar.zst
coredns-4c6c9d4b2700c3e4606d4b98bde64e7c1ed0c231.zip
Move cache Keys to 64bit for a better dispersion and lower collision frequency (#2077)
* - change Key for cache to 64bits. * - change Key for cache to 64bits.
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