Skip to content

Commit 8a1085e

Browse files
committed
perf: add policy map in translator context
Signed-off-by: kkk777-7 <[email protected]>
1 parent c368d6b commit 8a1085e

16 files changed

+237
-220
lines changed

internal/gatewayapi/backendtrafficpolicy.go

Lines changed: 52 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -33,37 +33,21 @@ const (
3333
MaxConsistentHashTableSize = 5000011 // https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/cluster/v3/cluster.proto#config-cluster-v3-cluster-maglevlbconfig
3434
)
3535

36-
func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources,
36+
func (t *Translator) ProcessBackendTrafficPolicies(
37+
translatorContext *TranslatorContext,
38+
resources *resource.Resources,
3739
gateways []*GatewayContext,
3840
routes []RouteContext,
3941
xdsIR resource.XdsIRMap,
4042
) []*egv1a1.BackendTrafficPolicy {
4143
backendTrafficPolicies := resources.BackendTrafficPolicies
4244
// BackendTrafficPolicies are already sorted by the provider layer
4345

44-
routeMapSize := len(routes)
4546
gatewayMapSize := len(gateways)
4647
policyMapSize := len(backendTrafficPolicies)
4748

4849
res := make([]*egv1a1.BackendTrafficPolicy, 0, policyMapSize)
4950

50-
// First build a map out of the routes and gateways for faster lookup since users might have thousands of routes or more.
51-
routeMap := make(map[policyTargetRouteKey]*policyRouteTargetContext, routeMapSize)
52-
for _, route := range routes {
53-
key := policyTargetRouteKey{
54-
Kind: string(route.GetRouteType()),
55-
Name: route.GetName(),
56-
Namespace: route.GetNamespace(),
57-
}
58-
routeMap[key] = &policyRouteTargetContext{RouteContext: route}
59-
}
60-
61-
gatewayMap := make(map[types.NamespacedName]*policyGatewayTargetContext, gatewayMapSize)
62-
for _, gw := range gateways {
63-
key := utils.NamespacedName(gw)
64-
gatewayMap[key] = &policyGatewayTargetContext{GatewayContext: gw}
65-
}
66-
6751
// Map of Gateway to the routes attached to it.
6852
gatewayRouteMap := &GatewayPolicyRouteMap{
6953
Routes: make(map[NamespacedNameWithSection]sets.Set[string], gatewayMapSize),
@@ -88,7 +72,7 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
8872
// 4. Finally, the policies targeting Gateways
8973

9074
// Build gateway policy maps, which are needed when processing the policies targeting xRoutes.
91-
t.buildGatewayPolicyMap(backendTrafficPolicies, gateways, gatewayMap, gatewayPolicyMap)
75+
t.buildGatewayPolicyMap(translatorContext, backendTrafficPolicies, gateways, gatewayPolicyMap)
9276

9377
// Process the policies targeting RouteRules
9478
for _, currPolicy := range backendTrafficPolicies {
@@ -104,8 +88,8 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
10488
res = append(res, policy)
10589
}
10690

107-
t.processBackendTrafficPolicyForRoute(resources, xdsIR,
108-
routeMap, gatewayRouteMap, gatewayPolicyMerged, gatewayPolicyMap, policy, currTarget)
91+
t.processBackendTrafficPolicyForRoute(translatorContext, resources, xdsIR,
92+
gatewayRouteMap, gatewayPolicyMerged, gatewayPolicyMap, policy, currTarget)
10993
}
11094
}
11195
}
@@ -124,8 +108,8 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
124108
res = append(res, policy)
125109
}
126110

127-
t.processBackendTrafficPolicyForRoute(resources, xdsIR,
128-
routeMap, gatewayRouteMap, gatewayPolicyMerged, gatewayPolicyMap, policy, currTarget)
111+
t.processBackendTrafficPolicyForRoute(translatorContext, resources, xdsIR,
112+
gatewayRouteMap, gatewayPolicyMerged, gatewayPolicyMap, policy, currTarget)
129113
}
130114
}
131115
}
@@ -143,8 +127,8 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
143127
handledPolicies[policyName] = policy
144128
res = append(res, policy)
145129
}
146-
t.processBackendTrafficPolicyForGateway(resources, xdsIR,
147-
gatewayMap, gatewayRouteMap, gatewayPolicyMerged, policy, currTarget)
130+
t.processBackendTrafficPolicyForGateway(translatorContext, resources, xdsIR,
131+
gatewayRouteMap, gatewayPolicyMerged, policy, currTarget)
148132
}
149133
}
150134
}
@@ -162,8 +146,8 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
162146
handledPolicies[policyName] = policy
163147
res = append(res, policy)
164148
}
165-
t.processBackendTrafficPolicyForGateway(resources, xdsIR,
166-
gatewayMap, gatewayRouteMap, gatewayPolicyMerged, policy, currTarget)
149+
t.processBackendTrafficPolicyForGateway(translatorContext, resources, xdsIR,
150+
gatewayRouteMap, gatewayPolicyMerged, policy, currTarget)
167151
}
168152
}
169153
}
@@ -178,9 +162,9 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
178162
}
179163

180164
func (t *Translator) buildGatewayPolicyMap(
165+
translatorContext *TranslatorContext,
181166
backendTrafficPolicies []*egv1a1.BackendTrafficPolicy,
182167
gateways []*GatewayContext,
183-
gatewayMap map[types.NamespacedName]*policyGatewayTargetContext,
184168
gatewayPolicyMap map[NamespacedNameWithSection]*egv1a1.BackendTrafficPolicy,
185169
) {
186170
for _, currPolicy := range backendTrafficPolicies {
@@ -192,8 +176,8 @@ func (t *Translator) buildGatewayPolicyMap(
192176
Name: string(currTarget.Name),
193177
Namespace: currPolicy.Namespace,
194178
}
195-
gateway, ok := gatewayMap[key]
196-
if !ok {
179+
gateway := translatorContext.GetPolicyTargetGateway(key)
180+
if gateway == nil {
197181
continue
198182
}
199183

@@ -222,9 +206,9 @@ func (t *Translator) buildGatewayPolicyMap(
222206
}
223207

224208
func (t *Translator) processBackendTrafficPolicyForRoute(
209+
translatorContext *TranslatorContext,
225210
resources *resource.Resources,
226211
xdsIR resource.XdsIRMap,
227-
routeMap map[policyTargetRouteKey]*policyRouteTargetContext,
228212
gatewayRouteMap *GatewayPolicyRouteMap,
229213
gatewayPolicyMergedMap *GatewayPolicyRouteMap,
230214
gatewayPolicyMap map[NamespacedNameWithSection]*egv1a1.BackendTrafficPolicy,
@@ -236,7 +220,7 @@ func (t *Translator) processBackendTrafficPolicyForRoute(
236220
resolveErr *status.PolicyResolveError
237221
)
238222

239-
targetedRoute, resolveErr = resolveBackendTrafficPolicyRouteTargetRef(policy, currTarget, routeMap)
223+
targetedRoute, resolveErr = resolveBackendTrafficPolicyRouteTargetRef(translatorContext, policy, currTarget)
240224
// Skip if the route is not found
241225
// It's not necessarily an error because the BackendTrafficPolicy may be
242226
// reconciled by multiple controllers. And the other controller may
@@ -398,7 +382,8 @@ func (t *Translator) processBackendTrafficPolicyForRoute(
398382
Name: string(currTarget.Name),
399383
Namespace: policy.Namespace,
400384
}
401-
overriddenTargetsMessage := getOverriddenTargetsMessageForRoute(routeMap[key], currTarget.SectionName)
385+
overriddenTargetsMessage := getOverriddenTargetsMessageForRoute(
386+
translatorContext.GetPolicyTargetRoute(key), currTarget.SectionName, egv1a1.KindBackendTrafficPolicy)
402387
if overriddenTargetsMessage != "" {
403388
status.SetConditionForPolicyAncestors(&policy.Status,
404389
ancestorRefs,
@@ -413,9 +398,9 @@ func (t *Translator) processBackendTrafficPolicyForRoute(
413398
}
414399

415400
func (t *Translator) processBackendTrafficPolicyForGateway(
401+
translatorContext *TranslatorContext,
416402
resources *resource.Resources,
417403
xdsIR resource.XdsIRMap,
418-
gatewayMap map[types.NamespacedName]*policyGatewayTargetContext,
419404
gatewayRouteMap *GatewayPolicyRouteMap,
420405
gatewayPolicyMergedMap *GatewayPolicyRouteMap,
421406
policy *egv1a1.BackendTrafficPolicy,
@@ -427,7 +412,7 @@ func (t *Translator) processBackendTrafficPolicyForGateway(
427412
)
428413

429414
// Negative statuses have already been assigned so it's safe to skip
430-
targetedGateway, resolveErr = resolveBackendTrafficPolicyGatewayTargetRef(policy, currTarget, gatewayMap)
415+
targetedGateway, resolveErr = resolveBackendTrafficPolicyGatewayTargetRef(translatorContext, policy, currTarget)
431416
if targetedGateway == nil {
432417
return
433418
}
@@ -461,7 +446,7 @@ func (t *Translator) processBackendTrafficPolicyForGateway(
461446
status.SetAcceptedForPolicyAncestor(&policy.Status, &ancestorRef, t.GatewayControllerName, policy.Generation)
462447

463448
overriddenMessage, mergedMessage := getOverriddenAndMergedTargetsMessageForGateway(
464-
gatewayMap[gatewayNN], gatewayRouteMap, gatewayPolicyMergedMap, currTarget.SectionName)
449+
translatorContext.GetPolicyTargetGateway(gatewayNN), gatewayRouteMap, gatewayPolicyMergedMap, currTarget.SectionName, egv1a1.KindBackendTrafficPolicy)
465450

466451
if mergedMessage != "" {
467452
status.SetConditionForPolicyAncestor(&policy.Status,
@@ -488,19 +473,19 @@ func (t *Translator) processBackendTrafficPolicyForGateway(
488473
}
489474

490475
func resolveBackendTrafficPolicyGatewayTargetRef(
476+
translatorContext *TranslatorContext,
491477
policy *egv1a1.BackendTrafficPolicy,
492478
target gwapiv1.LocalPolicyTargetReferenceWithSectionName,
493-
gateways map[types.NamespacedName]*policyGatewayTargetContext,
494479
) (*GatewayContext, *status.PolicyResolveError) {
495480
// Check if the gateway exists
496481
key := types.NamespacedName{
497482
Name: string(target.Name),
498483
Namespace: policy.Namespace,
499484
}
500-
gateway, ok := gateways[key]
485+
gateway := translatorContext.GetPolicyTargetGateway(key)
501486

502487
// Gateway not found
503-
if !ok {
488+
if gateway == nil {
504489
return nil, nil
505490
}
506491

@@ -517,7 +502,7 @@ func resolveBackendTrafficPolicyGatewayTargetRef(
517502

518503
if target.SectionName == nil {
519504
// Check if another policy targeting the same Gateway exists
520-
if gateway.attached {
505+
if gateway.attached != nil && gateway.attached[egv1a1.KindBackendTrafficPolicy] {
521506
message := fmt.Sprintf("Unable to target Gateway %s, another BackendTrafficPolicy has already attached to it",
522507
string(target.Name))
523508

@@ -526,12 +511,16 @@ func resolveBackendTrafficPolicyGatewayTargetRef(
526511
Message: message,
527512
}
528513
}
514+
if gateway.attached == nil {
515+
gateway.attached = make(map[string]bool)
516+
}
529517

530518
// Set context and save
531-
gateway.attached = true
519+
gateway.attached[egv1a1.KindBackendTrafficPolicy] = true
532520
} else {
533521
listenerName := string(*target.SectionName)
534-
if gateway.attachedToListeners != nil && gateway.attachedToListeners.Has(listenerName) {
522+
if gateway.attachedToListeners != nil && gateway.attachedToListeners[egv1a1.KindBackendTrafficPolicy] != nil &&
523+
gateway.attachedToListeners[egv1a1.KindBackendTrafficPolicy].Has(listenerName) {
535524
message := fmt.Sprintf("Unable to target Listener %s/%s, another BackendTrafficPolicy has already attached to it",
536525
key, listenerName)
537526

@@ -541,20 +530,21 @@ func resolveBackendTrafficPolicyGatewayTargetRef(
541530
}
542531
}
543532
if gateway.attachedToListeners == nil {
544-
gateway.attachedToListeners = make(sets.Set[string])
533+
gateway.attachedToListeners = make(map[string]sets.Set[string])
534+
}
535+
if gateway.attachedToListeners[egv1a1.KindBackendTrafficPolicy] == nil {
536+
gateway.attachedToListeners[egv1a1.KindBackendTrafficPolicy] = make(sets.Set[string])
545537
}
546-
gateway.attachedToListeners.Insert(listenerName)
538+
gateway.attachedToListeners[egv1a1.KindBackendTrafficPolicy].Insert(listenerName)
547539
}
548540

549-
gateways[key] = gateway
550-
551541
return gateway.GatewayContext, nil
552542
}
553543

554544
func resolveBackendTrafficPolicyRouteTargetRef(
545+
translatorContext *TranslatorContext,
555546
policy *egv1a1.BackendTrafficPolicy,
556547
target gwapiv1.LocalPolicyTargetReferenceWithSectionName,
557-
routes map[policyTargetRouteKey]*policyRouteTargetContext,
558548
) (RouteContext, *status.PolicyResolveError) {
559549
// Check if the route exists
560550
key := policyTargetRouteKey{
@@ -563,9 +553,9 @@ func resolveBackendTrafficPolicyRouteTargetRef(
563553
Namespace: policy.Namespace,
564554
}
565555

566-
route, ok := routes[key]
556+
route := translatorContext.GetPolicyTargetRoute(key)
567557
// Route not found
568-
if !ok {
558+
if route == nil {
569559
return nil, nil
570560
}
571561

@@ -578,7 +568,7 @@ func resolveBackendTrafficPolicyRouteTargetRef(
578568

579569
if target.SectionName == nil {
580570
// Check if another policy targeting the same xRoute exists
581-
if route.attached {
571+
if route.attached != nil && route.attached[egv1a1.KindBackendTrafficPolicy] {
582572
message := fmt.Sprintf("Unable to target %s %s, another BackendTrafficPolicy has already attached to it",
583573
string(target.Kind), string(target.Name))
584574

@@ -587,10 +577,14 @@ func resolveBackendTrafficPolicyRouteTargetRef(
587577
Message: message,
588578
}
589579
}
590-
route.attached = true
580+
if route.attached == nil {
581+
route.attached = make(map[string]bool)
582+
}
583+
route.attached[egv1a1.KindBackendTrafficPolicy] = true
591584
} else {
592585
routeRuleName := string(*target.SectionName)
593-
if route.attachedToRouteRules != nil && route.attachedToRouteRules.Has(routeRuleName) {
586+
if route.attachedToRouteRules != nil && route.attachedToRouteRules[egv1a1.KindBackendTrafficPolicy] != nil &&
587+
route.attachedToRouteRules[egv1a1.KindBackendTrafficPolicy].Has(routeRuleName) {
594588
message := fmt.Sprintf("Unable to target RouteRule %s/%s, another BackendTrafficPolicy has already attached to it",
595589
string(target.Name), routeRuleName)
596590

@@ -600,13 +594,14 @@ func resolveBackendTrafficPolicyRouteTargetRef(
600594
}
601595
}
602596
if route.attachedToRouteRules == nil {
603-
route.attachedToRouteRules = make(sets.Set[string])
597+
route.attachedToRouteRules = make(map[string]sets.Set[string])
598+
}
599+
if route.attachedToRouteRules[egv1a1.KindBackendTrafficPolicy] == nil {
600+
route.attachedToRouteRules[egv1a1.KindBackendTrafficPolicy] = make(sets.Set[string])
604601
}
605-
route.attachedToRouteRules.Insert(routeRuleName)
602+
route.attachedToRouteRules[egv1a1.KindBackendTrafficPolicy].Insert(routeRuleName)
606603
}
607604

608-
routes[key] = route
609-
610605
return route.RouteContext, nil
611606
}
612607

internal/gatewayapi/clienttrafficpolicy.go

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func hasSectionName(target *gwapiv1.LocalPolicyTargetReferenceWithSectionName) b
3737
}
3838

3939
func (t *Translator) ProcessClientTrafficPolicies(
40+
translatorContext *TranslatorContext,
4041
resources *resource.Resources,
4142
gateways []*GatewayContext,
4243
xdsIR resource.XdsIRMap,
@@ -47,16 +48,12 @@ func (t *Translator) ProcessClientTrafficPolicies(
4748
clientTrafficPolicies := resources.ClientTrafficPolicies
4849
// ClientTrafficPolicies are already sorted by the provider layer
4950

50-
policyMap := make(map[types.NamespacedName]sets.Set[string])
51+
gatewayMapSize := len(gateways)
52+
policyMapSize := len(clientTrafficPolicies)
5153

52-
// Build a map out of gateways for faster lookup since users might have hundreds of gateway or more.
53-
gatewayMap := map[types.NamespacedName]*policyGatewayTargetContext{}
54-
for _, gw := range gateways {
55-
key := utils.NamespacedName(gw)
56-
gatewayMap[key] = &policyGatewayTargetContext{GatewayContext: gw}
57-
}
54+
policyMap := make(map[types.NamespacedName]sets.Set[string], gatewayMapSize)
55+
handledPolicies := make(map[types.NamespacedName]*egv1a1.ClientTrafficPolicy, policyMapSize)
5856

59-
handledPolicies := make(map[types.NamespacedName]*egv1a1.ClientTrafficPolicy)
6057
// Translate
6158
// 1. First translate Policies with a sectionName set
6259
// 2. Then loop again and translate the policies without a sectionName
@@ -77,7 +74,7 @@ func (t *Translator) ProcessClientTrafficPolicies(
7774
res = append(res, policy)
7875
}
7976

80-
gateway, resolveErr := resolveClientTrafficPolicyTargetRef(policy, &currTarget, gatewayMap)
77+
gateway, resolveErr := resolveClientTrafficPolicyTargetRef(translatorContext, policy, &currTarget)
8178

8279
// Negative statuses have already been assigned so its safe to skip
8380
if gateway == nil {
@@ -172,7 +169,7 @@ func (t *Translator) ProcessClientTrafficPolicies(
172169
handledPolicies[policyName] = policy
173170
}
174171

175-
gateway, resolveErr := resolveClientTrafficPolicyTargetRef(policy, &currTarget, gatewayMap)
172+
gateway, resolveErr := resolveClientTrafficPolicyTargetRef(translatorContext, policy, &currTarget)
176173

177174
// Negative statuses have already been assigned so its safe to skip
178175
if gateway == nil {
@@ -284,19 +281,19 @@ func (t *Translator) ProcessClientTrafficPolicies(
284281
}
285282

286283
func resolveClientTrafficPolicyTargetRef(
284+
translatorContext *TranslatorContext,
287285
policy *egv1a1.ClientTrafficPolicy,
288286
targetRef *gwapiv1.LocalPolicyTargetReferenceWithSectionName,
289-
gateways map[types.NamespacedName]*policyGatewayTargetContext,
290287
) (*GatewayContext, *status.PolicyResolveError) {
291288
// Check if the gateway exists
292289
key := types.NamespacedName{
293290
Name: string(targetRef.Name),
294291
Namespace: policy.Namespace,
295292
}
296-
gateway, ok := gateways[key]
293+
gateway := translatorContext.GetPolicyTargetGateway(key)
297294

298295
// Gateway not found
299-
if !ok {
296+
if gateway == nil {
300297
return nil, nil
301298
}
302299

0 commit comments

Comments
 (0)