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
|
Next plugin.Handler
|
||||||
*Hostsfile
|
*Hostsfile
|
||||||
|
|
||||||
|
zones plugin.Zones
|
||||||
|
|
||||||
Fall fall.F
|
Fall fall.F
|
||||||
|
|
||||||
fallthroughUnsupported bool
|
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}
|
state := request.Request{W: w, Req: r}
|
||||||
qname := state.Name()
|
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 == "" {
|
if zone == "" {
|
||||||
// PTR zones don't need to be specified in Origins.
|
// PTR zones don't need to be specified in Origins.
|
||||||
if state.QType() != dns.TypePTR {
|
if state.QType() != dns.TypePTR {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/coredns/coredns/plugin"
|
||||||
"github.com/coredns/coredns/plugin/pkg/dnstest"
|
"github.com/coredns/coredns/plugin/pkg/dnstest"
|
||||||
"github.com/coredns/coredns/plugin/pkg/fall"
|
"github.com/coredns/coredns/plugin/pkg/fall"
|
||||||
"github.com/coredns/coredns/plugin/test"
|
"github.com/coredns/coredns/plugin/test"
|
||||||
@@ -211,3 +212,50 @@ const hostsExample = `
|
|||||||
reload 5s
|
reload 5s
|
||||||
timeout 3600
|
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.Origins = plugin.OriginsFromArgsOrServerBlock(args, c.ServerBlockKeys)
|
||||||
|
h.zones = plugin.Zones(h.Origins)
|
||||||
|
|
||||||
for c.NextBlock() {
|
for c.NextBlock() {
|
||||||
switch c.Val() {
|
switch c.Val() {
|
||||||
|
|||||||
Reference in New Issue
Block a user