From 56d870ac1f216d7adaa24b62058d482a0a1ac434 Mon Sep 17 00:00:00 2001 From: cr7258 Date: Thu, 20 Feb 2025 22:09:19 +0800 Subject: [PATCH] fix: lds wasmplugin cache issue --- pilot/pkg/networking/core/v1alpha3/gateway.go | 36 +++++++++++-------- .../pkg/networking/core/v1alpha3/listener.go | 29 ++++----------- 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/pilot/pkg/networking/core/v1alpha3/gateway.go b/pilot/pkg/networking/core/v1alpha3/gateway.go index 029e8983e103..a52fa66adc1e 100644 --- a/pilot/pkg/networking/core/v1alpha3/gateway.go +++ b/pilot/pkg/networking/core/v1alpha3/gateway.go @@ -310,6 +310,8 @@ func (configgen *ConfigGeneratorImpl) buildGatewayListeners(builder *ListenerBui } } } + + unpatchedListeners := make([]*listener.Listener, 0) for _, ml := range mutableopts { ml.mutable.Listener = buildGatewayListener(*ml.opts, ml.transport) log.Debugf("buildGatewayListeners: marshaling listener %q with %d filter chains", @@ -320,22 +322,28 @@ func (configgen *ConfigGeneratorImpl) buildGatewayListeners(builder *ListenerBui errs = multierror.Append(errs, fmt.Errorf("gateway omitting listener %q due to: %v", ml.mutable.Listener.Name, err.Error())) continue } - listeners = append(listeners, ml.mutable.Listener) - - if features.EnableLDSCaching { - listenerCache := &ListenerCache{ - ListenerName: ml.mutable.Listener.Name, - Gateways: gatewaysByListenerName[ml.mutable.Listener.Name], - EnvoyFilterKeys: efKeys, - WasmPlugins: listenerWasmPlugins, - } - resource := &discovery.Resource{ - Name: ml.mutable.Listener.Name, - Resource: protoconv.MessageToAny(ml.mutable.Listener), + unpatchedListeners = append(unpatchedListeners, ml.mutable.Listener) + } + if len(unpatchedListeners) > 0 { + builder.gatewayListeners = unpatchedListeners + builder.patchListeners() + for _, l := range builder.gatewayListeners { + if features.EnableLDSCaching { + listenerCache := &ListenerCache{ + ListenerName: l.Name, + Gateways: gatewaysByListenerName[l.Name], + EnvoyFilterKeys: efKeys, + WasmPlugins: listenerWasmPlugins, + } + resource := &discovery.Resource{ + Name: l.Name, + Resource: protoconv.MessageToAny(l), + } + configgen.Cache.Add(listenerCache, req, resource) } - configgen.Cache.Add(listenerCache, req, resource) } } + // We'll try to return any listeners we successfully marshaled; if we have none, we'll emit the error we built up err := errs.ErrorOrNil() if err != nil { @@ -348,7 +356,7 @@ func (configgen *ConfigGeneratorImpl) buildGatewayListeners(builder *ListenerBui return builder, cacheStats{} } - builder.gatewayListeners = listeners + builder.gatewayListeners = append(builder.gatewayListeners, listeners...) return builder, cacheStats{hits: hit, miss: miss} } diff --git a/pilot/pkg/networking/core/v1alpha3/listener.go b/pilot/pkg/networking/core/v1alpha3/listener.go index 1e27c44de0db..04279ade4a91 100644 --- a/pilot/pkg/networking/core/v1alpha3/listener.go +++ b/pilot/pkg/networking/core/v1alpha3/listener.go @@ -113,31 +113,14 @@ func (configgen *ConfigGeneratorImpl) BuildListeners(node *model.Proxy, builder, cacheStats = configgen.buildGatewayListeners(builder, req, efKeys) } - var l []*listener.Listener - // Because the EnvoyFilter still needs to be patched before the final LDS data is generated, - // it is determined here that as long as all LDS caches are hit, the cached listeners will be - // used to avoid repeatedly patching the EnvoyFilter. - var useCached bool - if !cacheStats.empty() && cacheStats.miss == 0 { - node.RLock() - if len(node.CachedListeners) > 0 { - l = node.CachedListeners - useCached = true - log.Debugf("node %s use cached listeners: %+v", node.ID, node.CachedListeners) - } - node.RUnlock() - } - if !useCached { + if builder.node.Type != model.Router { builder.patchListeners() - l = builder.getListeners() - if builder.node.EnableHBONE() && !builder.node.IsAmbient() { - l = append(l, buildConnectOriginateListener()) - } - node.Lock() - node.CachedListeners = l - log.Debugf("node %s cached listeners: %+v", node.ID, node.CachedListeners) - node.Unlock() } + l := builder.getListeners() + if builder.node.EnableHBONE() && !builder.node.IsAmbient() { + l = append(l, buildConnectOriginateListener()) + } + return l, model.XdsLogDetails{AdditionalInfo: fmt.Sprintf("cached:%v/%v", cacheStats.hits, cacheStats.hits+cacheStats.miss)} }