61 lines
2.9 KiB
Diff
61 lines
2.9 KiB
Diff
# UNDF: UNDF-2026-000000114
|
||
diff --git a/pilot/pkg/networking/core/envoyfilter/rc_patch.go b/pilot/pkg/networking/core/envoyfilter/rc_patch.go
|
||
index 1234567..abcdef0 100644
|
||
--- a/pilot/pkg/networking/core/envoyfilter/rc_patch.go
|
||
+++ b/pilot/pkg/networking/core/envoyfilter/rc_patch.go
|
||
@@ -73,12 +73,22 @@ func patchRouteConfig(
|
||
patchContext networking.EnvoyFilter_PatchContext,
|
||
efw *model.EnvoyFilterWrapper,
|
||
patches map[networking.EnvoyFilter_ApplyTo][]*model.EnvoyFilterConfigPatchWrapper,
|
||
routeConfiguration *route.RouteConfiguration, portMap model.GatewayPortMap,
|
||
) {
|
||
removedVirtualHosts := sets.New[string]()
|
||
+ // Build domain→VirtualHost index once so virtualHostMatch is O(1) per domain lookup
|
||
+ // rather than O(D) slices.Contains on every VH×patch combination.
|
||
+ domainIndex := make(map[string]*route.VirtualHost, len(routeConfiguration.VirtualHosts))
|
||
+ for _, vh := range routeConfiguration.VirtualHosts {
|
||
+ for _, d := range vh.Domains {
|
||
+ domainIndex[d] = vh
|
||
+ }
|
||
+ }
|
||
// first do removes/merges/replaces
|
||
for i := range routeConfiguration.VirtualHosts {
|
||
- if patchVirtualHost(patchContext, patches, routeConfiguration, routeConfiguration.VirtualHosts, i, portMap) {
|
||
+ if patchVirtualHost(patchContext, patches, routeConfiguration, routeConfiguration.VirtualHosts, i, portMap, domainIndex) {
|
||
removedVirtualHosts.Insert(routeConfiguration.VirtualHosts[i].Name)
|
||
}
|
||
}
|
||
@@ -106,7 +116,7 @@ func patchVirtualHost(
|
||
patches map[networking.EnvoyFilter_ApplyTo][]*model.EnvoyFilterConfigPatchWrapper,
|
||
routeConfiguration *route.RouteConfiguration, virtualHosts []*route.VirtualHost,
|
||
- idx int, portMap model.GatewayPortMap,
|
||
+ idx int, portMap model.GatewayPortMap, domainIndex map[string]*route.VirtualHost,
|
||
) bool {
|
||
for _, rp := range patches[networking.EnvoyFilter_VIRTUAL_HOST] {
|
||
applied := false
|
||
if commonConditionMatch(patchContext, rp) &&
|
||
routeConfigurationMatch(patchContext, routeConfiguration, rp, portMap) &&
|
||
- virtualHostMatch(virtualHosts[idx], rp) {
|
||
+ virtualHostMatch(virtualHosts[idx], rp, domainIndex) {
|
||
@@ -327,10 +337,12 @@ func virtualHostMatch(vh *route.VirtualHost, rp *model.EnvoyFilterConfigPatchWra
|
||
-func virtualHostMatch(vh *route.VirtualHost, rp *model.EnvoyFilterConfigPatchWrapper) bool {
|
||
+func virtualHostMatch(vh *route.VirtualHost, rp *model.EnvoyFilterConfigPatchWrapper, domainIndex map[string]*route.VirtualHost) bool {
|
||
rMatch := rp.Match.GetRouteConfiguration()
|
||
if rMatch == nil {
|
||
return true
|
||
}
|
||
|
||
match := rMatch.Vhost
|
||
if match == nil {
|
||
return true
|
||
}
|
||
if vh == nil {
|
||
return false
|
||
}
|
||
|
||
// check if virtual host name and a domain name matches
|
||
+ // O(1) map lookup instead of O(D) slices.Contains(vh.Domains, match.DomainName)
|
||
return (match.Name == "" || match.Name == vh.Name) &&
|
||
- (match.DomainName == "" || slices.Contains(vh.Domains, match.DomainName))
|
||
+ (match.DomainName == "" || domainIndex[match.DomainName] == vh)
|
||
}
|