Skip to content

Commit e90b32c

Browse files
committed
Merge branch 'perf/status-route-evaluation-20260618'
2 parents 8736b50 + 83e8c50 commit e90b32c

9 files changed

Lines changed: 544 additions & 369 deletions

internal/status/evaluator.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,54 +9,55 @@ import (
99
)
1010

1111
func evaluateRoutes(state *clusterState) routeState {
12+
ctx := newRouteEvaluationContext(state)
1213
out := routeState{
1314
http: make(map[client.ObjectKey][]routeParentEvaluation),
1415
grpc: make(map[client.ObjectKey][]routeParentEvaluation),
1516
tcp: make(map[client.ObjectKey][]routeParentEvaluation),
1617
udp: make(map[client.ObjectKey][]routeParentEvaluation),
1718
tls: make(map[client.ObjectKey][]routeParentEvaluation),
18-
attachments: make(map[listenerKey]map[string]struct{}),
19+
attachments: make(map[listenerKey]routeAttachmentSet),
1920
}
2021

2122
for _, route := range state.httpRoutes {
2223
key := client.ObjectKeyFromObject(&route)
23-
evals := evaluateRoute(state, httpRouteInput(route))
24+
evals := ctx.evaluateRoute(httpRouteInput(route))
2425
out.http[key] = evals
2526
recordAttachments(out.attachments, key, evals)
2627
}
2728

2829
for _, route := range state.grpcRoutes {
2930
key := client.ObjectKeyFromObject(&route)
30-
evals := evaluateRoute(state, grpcRouteInput(route))
31+
evals := ctx.evaluateRoute(grpcRouteInput(route))
3132
out.grpc[key] = evals
3233
recordAttachments(out.attachments, key, evals)
3334
}
3435

3536
for _, route := range state.tcpRoutes {
3637
key := client.ObjectKeyFromObject(&route)
37-
evals := evaluateRoute(state, tcpRouteInput(route))
38+
evals := ctx.evaluateRoute(tcpRouteInput(route))
3839
out.tcp[key] = evals
3940
recordAttachments(out.attachments, key, evals)
4041
}
4142

4243
for _, route := range state.udpRoutes {
4344
key := client.ObjectKeyFromObject(&route)
44-
evals := evaluateRoute(state, udpRouteInput(route))
45+
evals := ctx.evaluateRoute(udpRouteInput(route))
4546
out.udp[key] = evals
4647
recordAttachments(out.attachments, key, evals)
4748
}
4849

4950
for _, route := range state.tlsRoutes {
5051
key := client.ObjectKeyFromObject(&route)
51-
evals := evaluateRoute(state, tlsRouteInput(route))
52+
evals := ctx.evaluateRoute(tlsRouteInput(route))
5253
out.tls[key] = evals
5354
recordAttachments(out.attachments, key, evals)
5455
}
5556

5657
return out
5758
}
5859

59-
func evaluateGateways(state *clusterState, attachments map[listenerKey]map[string]struct{}) map[client.ObjectKey]gatewayEvaluation {
60+
func evaluateGateways(state *clusterState, attachments map[listenerKey]routeAttachmentSet) map[client.ObjectKey]gatewayEvaluation {
6061
out := make(map[client.ObjectKey]gatewayEvaluation, len(state.managedGateways))
6162

6263
for _, gateway := range state.managedGateways {

internal/status/evaluator_benchmark_test.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ var (
1717
benchmarkListenerStatusSink []gatewayv1.ListenerStatus
1818
benchmarkBackendTLSPoliciesSink map[client.ObjectKey]backendTLSPolicyEvaluation
1919
benchmarkBackendLBPoliciesSink map[client.ObjectKey]backendLBPolicyEvaluation
20-
benchmarkGatewayAttachmentsSink map[listenerKey]map[string]struct{}
20+
benchmarkGatewayAttachmentsSink map[listenerKey]routeAttachmentSet
2121
)
2222

2323
func BenchmarkEvaluateRoutesRouteFanout(b *testing.B) {
@@ -103,18 +103,21 @@ func benchmarkLoadStatusState(b *testing.B, reconciler *Reconciler) *clusterStat
103103
return state
104104
}
105105

106-
func benchmarkGatewayFleetAttachments(state *clusterState, attachedPerListener int) map[listenerKey]map[string]struct{} {
107-
out := make(map[listenerKey]map[string]struct{}, len(state.managedGateways))
106+
func benchmarkGatewayFleetAttachments(state *clusterState, attachedPerListener int) map[listenerKey]routeAttachmentSet {
107+
out := make(map[listenerKey]routeAttachmentSet, len(state.managedGateways))
108108
for _, gateway := range state.managedGateways {
109109
for _, listener := range gateway.Spec.Listeners {
110110
key := listenerKey{
111111
gatewayNamespace: gateway.Namespace,
112112
gatewayName: gateway.Name,
113113
listenerName: listener.Name,
114114
}
115-
attached := make(map[string]struct{}, attachedPerListener)
115+
attached := make(routeAttachmentSet, attachedPerListener)
116116
for i := 0; i < attachedPerListener; i++ {
117-
attached[fmt.Sprintf("%s/%s-route-%d", gateway.Namespace, gateway.Name, i)] = struct{}{}
117+
attached[client.ObjectKey{
118+
Namespace: gateway.Namespace,
119+
Name: fmt.Sprintf("%s-route-%d", gateway.Name, i),
120+
}] = struct{}{}
118121
}
119122
out[key] = attached
120123
}

internal/status/evaluator_listener_sets.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func evaluateListenerSets(
2727
state *clusterState,
2828
lses []gatewayv1.ListenerSet,
2929
managedGateways map[string]gatewayv1.Gateway,
30-
attachments map[listenerKey]map[string]struct{},
30+
attachments map[listenerKey]routeAttachmentSet,
3131
) map[string]listenerSetEvaluation {
3232
out := make(map[string]listenerSetEvaluation, len(lses))
3333
gwToLSes := groupListenerSetsByGateway(lses)
@@ -87,7 +87,7 @@ func evaluateOneListenerSet(
8787
gw gatewayv1.Gateway,
8888
conflictListeners []gatewayv1.Listener,
8989
state *clusterState,
90-
attachments map[listenerKey]map[string]struct{},
90+
attachments map[listenerKey]routeAttachmentSet,
9191
) listenerSetEvaluation {
9292
allowed := gatewayAllowsListenerSet(gw, ls, state.namespaceByName)
9393
if !allowed {
@@ -237,7 +237,7 @@ func listenerSetEntryAttachedRoutes(
237237
gateway gatewayv1.Gateway,
238238
ls gatewayv1.ListenerSet,
239239
entry gatewayv1.ListenerEntry,
240-
attachments map[listenerKey]map[string]struct{},
240+
attachments map[listenerKey]routeAttachmentSet,
241241
) int32 {
242242
if len(attachments) == 0 {
243243
return 0
@@ -287,7 +287,7 @@ func evaluateGatewayListenerSetListeners(
287287
state *clusterState,
288288
gateway gatewayv1.Gateway,
289289
listenerSets []gatewayv1.ListenerSet,
290-
attachments map[listenerKey]map[string]struct{},
290+
attachments map[listenerKey]routeAttachmentSet,
291291
) []listenerEvaluation {
292292
if len(listenerSets) == 0 {
293293
return nil

internal/status/evaluator_policies.go

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,6 @@ import (
1515
"github.com/nantian-gw/gateway/internal/mesh"
1616
)
1717

18-
func candidateListeners(state *clusterState, gateway gatewayv1.Gateway, parentRef gatewayv1.ParentReference) []gatewayv1.Listener {
19-
out := make([]gatewayv1.Listener, 0, len(gateway.Spec.Listeners))
20-
for _, listener := range gateway.Spec.Listeners {
21-
if parentRef.SectionName != nil && listener.Name != *parentRef.SectionName {
22-
continue
23-
}
24-
if parentRef.Port != nil && listener.Port != *parentRef.Port {
25-
continue
26-
}
27-
out = append(out, listener)
28-
}
29-
return out
30-
}
31-
3218
func serviceParentPortMatches(service corev1.Service, parentRef gatewayv1.ParentReference) bool {
3319
if parentRef.Port == nil {
3420
return true
@@ -269,7 +255,12 @@ func referenceGrantToAllowed(items []gatewayv1beta1.ReferenceGrantTo, expected g
269255
}
270256

271257
func httpRouteBackends(route gatewayv1.HTTPRoute) []backendInput {
272-
out := make([]backendInput, 0)
258+
total := 0
259+
for _, rule := range route.Spec.Rules {
260+
total += len(rule.BackendRefs)
261+
}
262+
263+
out := make([]backendInput, 0, total)
273264
for _, rule := range route.Spec.Rules {
274265
for _, backendRef := range rule.BackendRefs {
275266
out = append(out, backendInput{
@@ -285,7 +276,12 @@ func httpRouteBackends(route gatewayv1.HTTPRoute) []backendInput {
285276
}
286277

287278
func grpcRouteBackends(route gatewayv1.GRPCRoute) []backendInput {
288-
out := make([]backendInput, 0)
279+
total := 0
280+
for _, rule := range route.Spec.Rules {
281+
total += len(rule.BackendRefs)
282+
}
283+
284+
out := make([]backendInput, 0, total)
289285
for _, rule := range route.Spec.Rules {
290286
for _, backendRef := range rule.BackendRefs {
291287
out = append(out, backendInput{
@@ -301,7 +297,12 @@ func grpcRouteBackends(route gatewayv1.GRPCRoute) []backendInput {
301297
}
302298

303299
func tcpRouteBackends(route gatewayv1alpha2.TCPRoute) []backendInput {
304-
out := make([]backendInput, 0)
300+
total := 0
301+
for _, rule := range route.Spec.Rules {
302+
total += len(rule.BackendRefs)
303+
}
304+
305+
out := make([]backendInput, 0, total)
305306
for _, rule := range route.Spec.Rules {
306307
for _, backendRef := range rule.BackendRefs {
307308
out = append(out, backendInput{
@@ -317,7 +318,12 @@ func tcpRouteBackends(route gatewayv1alpha2.TCPRoute) []backendInput {
317318
}
318319

319320
func udpRouteBackends(route gatewayv1alpha2.UDPRoute) []backendInput {
320-
out := make([]backendInput, 0)
321+
total := 0
322+
for _, rule := range route.Spec.Rules {
323+
total += len(rule.BackendRefs)
324+
}
325+
326+
out := make([]backendInput, 0, total)
321327
for _, rule := range route.Spec.Rules {
322328
for _, backendRef := range rule.BackendRefs {
323329
out = append(out, backendInput{
@@ -333,7 +339,12 @@ func udpRouteBackends(route gatewayv1alpha2.UDPRoute) []backendInput {
333339
}
334340

335341
func tlsRouteBackends(route gatewayv1alpha2.TLSRoute) []backendInput {
336-
out := make([]backendInput, 0)
342+
total := 0
343+
for _, rule := range route.Spec.Rules {
344+
total += len(rule.BackendRefs)
345+
}
346+
347+
out := make([]backendInput, 0, total)
337348
for _, rule := range route.Spec.Rules {
338349
for _, backendRef := range rule.BackendRefs {
339350
out = append(out, backendInput{

0 commit comments

Comments
 (0)