diff --git a/plugin/cache/cache_test.go b/plugin/cache/cache_test.go index 1a4d178f2..ed1d38c41 100644 --- a/plugin/cache/cache_test.go +++ b/plugin/cache/cache_test.go @@ -594,16 +594,25 @@ func BenchmarkCacheResponse(b *testing.B) { ctx := context.TODO() + // Add some answers since these need to be duplicated when + // serving a cached response. + answer := []dns.RR{ + test.MX("miek.nl. 3601 IN MX 1 aspmx.l.google.com."), + test.MX("miek.nl. 3601 IN MX 10 aspmx2.googlemail.com."), + } 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) + reqs[i].Answer = answer } + b.ResetTimer() + rw := &test.ResponseWriter{} j := 0 for b.Loop() { req := reqs[j] - c.ServeDNS(ctx, &test.ResponseWriter{}, req) + c.ServeDNS(ctx, rw, req) j = (j + 1) % 5 } } diff --git a/plugin/cache/dnssec.go b/plugin/cache/dnssec.go index da7e1e9b3..e0059403b 100644 --- a/plugin/cache/dnssec.go +++ b/plugin/cache/dnssec.go @@ -6,8 +6,14 @@ import "github.com/miekg/dns" // If dup is true the RRs in rrs are _copied_ before adjusting their // TTL and the slice of copied RRs is returned. func filterRRSlice(rrs []dns.RR, ttl uint32, dup bool) []dns.RR { + n := 0 + for _, r := range rrs { + if r.Header().Rrtype != dns.TypeOPT { + n++ + } + } + rs := make([]dns.RR, n) j := 0 - rs := make([]dns.RR, len(rrs)) for _, r := range rrs { if r.Header().Rrtype == dns.TypeOPT { continue @@ -20,5 +26,5 @@ func filterRRSlice(rrs []dns.RR, ttl uint32, dup bool) []dns.RR { rs[j].Header().Ttl = ttl j++ } - return rs[:j] + return rs } diff --git a/plugin/cache/item.go b/plugin/cache/item.go index c5aeccdcc..3259d4a72 100644 --- a/plugin/cache/item.go +++ b/plugin/cache/item.go @@ -82,10 +82,6 @@ func (i *item) toMsg(m *dns.Msg, now time.Time, do bool, ad bool) *dns.Msg { m1.RecursionAvailable = i.RecursionAvailable m1.Rcode = i.Rcode - m1.Answer = make([]dns.RR, len(i.Answer)) - m1.Ns = make([]dns.RR, len(i.Ns)) - m1.Extra = make([]dns.RR, len(i.Extra)) - ttl := uint32(i.ttl(now)) m1.Answer = filterRRSlice(i.Answer, ttl, true) m1.Ns = filterRRSlice(i.Ns, ttl, true)