java-topology/defects/istio/patch/0001-virtualhost-domains-use-map-index.patch

61 lines
2.9 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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