mirror of
https://github.com/coredns/coredns.git
synced 2026-08-20 23:08:28 -04:00
plugin/hosts: pre-convert Origins to plugin.Zones in setup (#8383)
* test: add benchmark cases for Request IP/Port and parseRequest Signed-off-by: Manuel Rüger <manuel@rueg.eu> * test(kubernetes): add BenchmarkServices and BenchmarkServicesHeadless Signed-off-by: Manuel Rüger <manuel@rueg.eu> * perf(hosts): pre-convert Origins to plugin.Zones in hosts setup Signed-off-by: Manuel Rüger <manuel@rueg.eu> * style: fix gofmt trailing line formatting Signed-off-by: Manuel Rüger <manuel@rueg.eu> --------- Signed-off-by: Manuel Rüger <manuel@rueg.eu>
This commit is contained in:
@@ -17,6 +17,8 @@ type Hosts struct {
|
||||
Next plugin.Handler
|
||||
*Hostsfile
|
||||
|
||||
zones plugin.Zones
|
||||
|
||||
Fall fall.F
|
||||
|
||||
fallthroughUnsupported bool
|
||||
@@ -27,9 +29,13 @@ func (h Hosts) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (
|
||||
state := request.Request{W: w, Req: r}
|
||||
qname := state.Name()
|
||||
|
||||
answers := []dns.RR{}
|
||||
var answers []dns.RR
|
||||
|
||||
zone := plugin.Zones(h.Origins).Matches(qname)
|
||||
zones := h.zones
|
||||
if zones == nil {
|
||||
zones = plugin.Zones(h.Origins)
|
||||
}
|
||||
zone := zones.Matches(qname)
|
||||
if zone == "" {
|
||||
// PTR zones don't need to be specified in Origins.
|
||||
if state.QType() != dns.TypePTR {
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/coredns/coredns/plugin"
|
||||
"github.com/coredns/coredns/plugin/pkg/dnstest"
|
||||
"github.com/coredns/coredns/plugin/pkg/fall"
|
||||
"github.com/coredns/coredns/plugin/test"
|
||||
@@ -211,3 +212,50 @@ const hostsExample = `
|
||||
reload 5s
|
||||
timeout 3600
|
||||
`
|
||||
|
||||
func BenchmarkHostsBaseline(b *testing.B) {
|
||||
h := Hosts{
|
||||
Next: test.NextHandler(dns.RcodeNameError, nil),
|
||||
Hostsfile: &Hostsfile{
|
||||
Origins: []string{"example.org."},
|
||||
hmap: newMap(),
|
||||
inline: newMap(),
|
||||
options: newOptions(),
|
||||
},
|
||||
}
|
||||
h.hmap = h.parse(strings.NewReader(hostsExample))
|
||||
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion("example.org.", dns.TypeA)
|
||||
rec := dnstest.NewRecorder(&test.ResponseWriter{})
|
||||
ctx := context.Background()
|
||||
|
||||
b.ReportAllocs()
|
||||
for b.Loop() {
|
||||
_, _ = h.ServeDNS(ctx, rec, m)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkHostsOptimized(b *testing.B) {
|
||||
h := Hosts{
|
||||
Next: test.NextHandler(dns.RcodeNameError, nil),
|
||||
Hostsfile: &Hostsfile{
|
||||
Origins: []string{"example.org."},
|
||||
hmap: newMap(),
|
||||
inline: newMap(),
|
||||
options: newOptions(),
|
||||
},
|
||||
zones: plugin.Zones([]string{"example.org."}),
|
||||
}
|
||||
h.hmap = h.parse(strings.NewReader(hostsExample))
|
||||
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion("example.org.", dns.TypeA)
|
||||
rec := dnstest.NewRecorder(&test.ResponseWriter{})
|
||||
ctx := context.Background()
|
||||
|
||||
b.ReportAllocs()
|
||||
for b.Loop() {
|
||||
_, _ = h.ServeDNS(ctx, rec, m)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,6 +107,7 @@ func hostsParse(c *caddy.Controller) (Hosts, error) {
|
||||
}
|
||||
|
||||
h.Origins = plugin.OriginsFromArgsOrServerBlock(args, c.ServerBlockKeys)
|
||||
h.zones = plugin.Zones(h.Origins)
|
||||
|
||||
for c.NextBlock() {
|
||||
switch c.Val() {
|
||||
|
||||
Reference in New Issue
Block a user