From a1642a64dc3f56e65afffa796622cb76846ce590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20R=C3=BCger?= Date: Tue, 4 Aug 2026 03:44:27 +0200 Subject: [PATCH] plugin/forward: fast-path string comparison in isAllowedDomain (#8385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test: add benchmark cases for Request IP/Port and parseRequest Signed-off-by: Manuel Rüger * test(kubernetes): add BenchmarkServices and BenchmarkServicesHeadless Signed-off-by: Manuel Rüger * perf(forward): fast-path string comparison in isAllowedDomain Signed-off-by: Manuel Rüger --------- Signed-off-by: Manuel Rüger --- plugin/kubernetes/kubernetes_test.go | 30 ++++++++++++++++++++++++++++ plugin/kubernetes/parse_test.go | 7 +++++++ request/request_test.go | 20 +++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/plugin/kubernetes/kubernetes_test.go b/plugin/kubernetes/kubernetes_test.go index f663be44a..d27ff17a7 100644 --- a/plugin/kubernetes/kubernetes_test.go +++ b/plugin/kubernetes/kubernetes_test.go @@ -493,3 +493,33 @@ func TestServicesAuthority(t *testing.T) { } } } + +func BenchmarkServices(b *testing.B) { + k := New([]string{"inter.webs.tests."}) + k.APIConn = APIConnServiceTest{} + ctx := context.TODO() + + m := new(dns.Msg) + m.SetQuestion("svc1.testns.svc.inter.webs.tests.", dns.TypeA) + state := request.Request{Zone: k.Zones[0], Req: m} + + b.ReportAllocs() + for b.Loop() { + _, _ = k.Services(ctx, state, false, plugin.Options{}) + } +} + +func BenchmarkServicesHeadless(b *testing.B) { + k := New([]string{"inter.webs.tests."}) + k.APIConn = APIConnServiceTest{} + ctx := context.TODO() + + m := new(dns.Msg) + m.SetQuestion("hdls1.testns.svc.inter.webs.tests.", dns.TypeA) + state := request.Request{Zone: k.Zones[0], Req: m} + + b.ReportAllocs() + for b.Loop() { + _, _ = k.Services(ctx, state, false, plugin.Options{}) + } +} diff --git a/plugin/kubernetes/parse_test.go b/plugin/kubernetes/parse_test.go index a19b1d4a1..4cee8538a 100644 --- a/plugin/kubernetes/parse_test.go +++ b/plugin/kubernetes/parse_test.go @@ -63,3 +63,10 @@ func TestParseInvalidRequest(t *testing.T) { } const zone = "inter.webs.tests." + +func BenchmarkParseRequest(b *testing.B) { + b.ReportAllocs() + for b.Loop() { + _, _ = parseRequest("1-2-3-4.webs.mynamespace.svc.inter.webs.tests.", zone, false) + } +} diff --git a/request/request_test.go b/request/request_test.go index 240f02c31..ae7410abf 100644 --- a/request/request_test.go +++ b/request/request_test.go @@ -381,3 +381,23 @@ func TestRequestClear(t *testing.T) { t.Errorf("Expected st.port to be cleared after Clear") } } + +func BenchmarkRequestIP(b *testing.B) { + st := testRequest() + b.ReportAllocs() + + for b.Loop() { + st.Clear() + _ = st.IP() + } +} + +func BenchmarkRequestPort(b *testing.B) { + st := testRequest() + b.ReportAllocs() + + for b.Loop() { + st.Clear() + _ = st.Port() + } +}