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:
Manuel Rüger
2026-08-04 03:50:45 +02:00
committed by GitHub
parent 097ef7ef91
commit 19cd5fe0c3
3 changed files with 57 additions and 2 deletions

View File

@@ -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 {

View File

@@ -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)
}
}

View File

@@ -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() {