aboutsummaryrefslogtreecommitdiff
path: root/middleware/cache/cache_test.go
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2017-06-26 07:44:25 -0700
committerGravatar GitHub <noreply@github.com> 2017-06-26 07:44:25 -0700
commitda5880a273311c90b4abfd16f07ac2d2e4b4a5c7 (patch)
treede204b2349238189330741c96fa6546b0d9c4ebe /middleware/cache/cache_test.go
parentea90702bfc8a8589a15213bd5dcf58b2a9af758b (diff)
downloadcoredns-da5880a273311c90b4abfd16f07ac2d2e4b4a5c7.tar.gz
coredns-da5880a273311c90b4abfd16f07ac2d2e4b4a5c7.tar.zst
coredns-da5880a273311c90b4abfd16f07ac2d2e4b4a5c7.zip
middleware/cache: fix race (#757)
While adding a parallel performance benchmark I stumbled on a race condition (another reason to add performance benchmarks!), so this PR makes sure the msg is created in a race free manor and adds the parallel benchmark.
Diffstat (limited to 'middleware/cache/cache_test.go')
-rw-r--r--middleware/cache/cache_test.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/middleware/cache/cache_test.go b/middleware/cache/cache_test.go
index adac7d67b..f364e69f1 100644
--- a/middleware/cache/cache_test.go
+++ b/middleware/cache/cache_test.go
@@ -6,6 +6,8 @@ import (
"testing"
"time"
+ "golang.org/x/net/context"
+
"github.com/coredns/coredns/middleware"
"github.com/coredns/coredns/middleware/pkg/cache"
"github.com/coredns/coredns/middleware/pkg/response"
@@ -205,3 +207,45 @@ func TestCache(t *testing.T) {
}
}
}
+
+func BenchmarkCacheResponse(b *testing.B) {
+ c := &Cache{Zones: []string{"."}, pcap: defaultCap, ncap: defaultCap, pttl: maxTTL, nttl: maxTTL}
+ c.pcache = cache.New(c.pcap)
+ c.ncache = cache.New(c.ncap)
+ c.prefetch = 1
+ c.duration = 1 * time.Second
+ c.Next = BackendHandler()
+
+ ctx := context.TODO()
+
+ reqs := make([]*dns.Msg, 5)
+ for i, q := range []string{"example1", "example2", "a", "b", "ddd"} {
+ reqs[i] = new(dns.Msg)
+ reqs[i].SetQuestion(q+".example.org.", dns.TypeA)
+ }
+
+ b.RunParallel(func(pb *testing.PB) {
+ i := 0
+ for pb.Next() {
+ req := reqs[i]
+ c.ServeDNS(ctx, &test.ResponseWriter{}, req)
+ i++
+ i = i % 5
+ }
+ })
+}
+
+func BackendHandler() middleware.Handler {
+ return middleware.HandlerFunc(func(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
+ m := new(dns.Msg)
+ m.SetReply(r)
+ m.Response = true
+ m.RecursionAvailable = true
+
+ owner := m.Question[0].Name
+ m.Answer = []dns.RR{test.A(owner + " 303 IN A 127.0.0.53")}
+
+ w.WriteMsg(m)
+ return dns.RcodeSuccess, nil
+ })
+}