From 74cc2e05f3af3d8a8045b9fea4a0583c36448276 Mon Sep 17 00:00:00 2001 From: Takeshi Yoneda Date: Tue, 13 May 2025 05:53:54 +0900 Subject: [PATCH 1/3] fix: avoid appending same Backends twice to resource map Signed-off-by: Takeshi Yoneda --- internal/provider/kubernetes/controller.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/internal/provider/kubernetes/controller.go b/internal/provider/kubernetes/controller.go index 90ed2dd13d..cc10000f59 100644 --- a/internal/provider/kubernetes/controller.go +++ b/internal/provider/kubernetes/controller.go @@ -291,7 +291,7 @@ func (r *gatewayAPIReconciler) Reconcile(ctx context.Context, _ reconcile.Reques } if r.backendCRDExists { - if err = r.processBackends(ctx, gwcResource); err != nil { + if err = r.processBackends(ctx, gwcResource, resourceMappings); err != nil { r.log.Error(err, fmt.Sprintf("failed processBackends for gatewayClass %s, skipping it", managedGC.Name)) continue } @@ -1305,7 +1305,7 @@ func (r *gatewayAPIReconciler) processBackendTLSPolicies( } // processBackends adds Backends to the resourceTree -func (r *gatewayAPIReconciler) processBackends(ctx context.Context, resourceTree *resource.Resources) error { +func (r *gatewayAPIReconciler) processBackends(ctx context.Context, resourceTree *resource.Resources, resourceMappings *resourceMappings) error { backends := egv1a1.BackendList{} if err := r.client.List(ctx, &backends); err != nil { return fmt.Errorf("error listing Backends: %w", err) @@ -1313,10 +1313,25 @@ func (r *gatewayAPIReconciler) processBackends(ctx context.Context, resourceTree for _, backend := range backends.Items { backend := backend //nolint:copyloopvar + // We only interested in Backends that are referenced by GatewayClass. + if !resourceMappings.allAssociatedBackendRefs.Has(gwapiv1.BackendObjectReference{ + Group: (*gwapiv1.Group)(&backend.APIVersion), + Kind: (*gwapiv1.Kind)(&backend.Kind), + Name: gwapiv1.ObjectName(backend.Name), + Namespace: gatewayapi.NamespacePtr(backend.Namespace), + }) { + continue + } // Discard Status to reduce memory consumption in watchable // It will be recomputed by the gateway-api layer backend.Status = egv1a1.BackendStatus{} - resourceTree.Backends = append(resourceTree.Backends, &backend) + resourceMappings.allAssociatedNamespaces.Insert(backend.Namespace) + // Backend will be also added in processBackendRefs. Make sure that we don't add it twice. + key := utils.NamespacedName(&backend).String() + if !resourceMappings.allAssociatedBackends.Has(key) { + resourceMappings.allAssociatedBackends.Insert(key) + resourceTree.Backends = append(resourceTree.Backends, &backend) + } } return nil } From ae6137e4b26587f183b6ba01e07ca36cc9bd89c9 Mon Sep 17 00:00:00 2001 From: Takeshi Yoneda Date: Tue, 13 May 2025 06:22:15 +0900 Subject: [PATCH 2/3] more Signed-off-by: Takeshi Yoneda --- internal/provider/kubernetes/controller.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/internal/provider/kubernetes/controller.go b/internal/provider/kubernetes/controller.go index cc10000f59..66a2490366 100644 --- a/internal/provider/kubernetes/controller.go +++ b/internal/provider/kubernetes/controller.go @@ -1326,12 +1326,9 @@ func (r *gatewayAPIReconciler) processBackends(ctx context.Context, resourceTree // It will be recomputed by the gateway-api layer backend.Status = egv1a1.BackendStatus{} resourceMappings.allAssociatedNamespaces.Insert(backend.Namespace) - // Backend will be also added in processBackendRefs. Make sure that we don't add it twice. - key := utils.NamespacedName(&backend).String() - if !resourceMappings.allAssociatedBackends.Has(key) { - resourceMappings.allAssociatedBackends.Insert(key) - resourceTree.Backends = append(resourceTree.Backends, &backend) - } + resourceMappings.allAssociatedBackends.Insert(utils.NamespacedName(&backend).String()) + // Backend might also be added in processBackendRefs. Make sure that we don't add it twice. + resourceTree.Backends = append(resourceTree.Backends, &backend) } return nil } From 695368e6fa17b12f2f27acce192a12d9af6c6fc4 Mon Sep 17 00:00:00 2001 From: Takeshi Yoneda Date: Tue, 13 May 2025 08:05:41 +0900 Subject: [PATCH 3/3] rm Signed-off-by: Takeshi Yoneda --- internal/provider/kubernetes/controller.go | 36 ---------------------- 1 file changed, 36 deletions(-) diff --git a/internal/provider/kubernetes/controller.go b/internal/provider/kubernetes/controller.go index 66a2490366..4b1454b952 100644 --- a/internal/provider/kubernetes/controller.go +++ b/internal/provider/kubernetes/controller.go @@ -290,13 +290,6 @@ func (r *gatewayAPIReconciler) Reconcile(ctx context.Context, _ reconcile.Reques continue } - if r.backendCRDExists { - if err = r.processBackends(ctx, gwcResource, resourceMappings); err != nil { - r.log.Error(err, fmt.Sprintf("failed processBackends for gatewayClass %s, skipping it", managedGC.Name)) - continue - } - } - // Add the referenced services, ServiceImports, and EndpointSlices in // the collected BackendRefs to the resourceTree. // BackendRefs are referred by various Route objects and the ExtAuth in SecurityPolicies. @@ -1304,35 +1297,6 @@ func (r *gatewayAPIReconciler) processBackendTLSPolicies( return nil } -// processBackends adds Backends to the resourceTree -func (r *gatewayAPIReconciler) processBackends(ctx context.Context, resourceTree *resource.Resources, resourceMappings *resourceMappings) error { - backends := egv1a1.BackendList{} - if err := r.client.List(ctx, &backends); err != nil { - return fmt.Errorf("error listing Backends: %w", err) - } - - for _, backend := range backends.Items { - backend := backend //nolint:copyloopvar - // We only interested in Backends that are referenced by GatewayClass. - if !resourceMappings.allAssociatedBackendRefs.Has(gwapiv1.BackendObjectReference{ - Group: (*gwapiv1.Group)(&backend.APIVersion), - Kind: (*gwapiv1.Kind)(&backend.Kind), - Name: gwapiv1.ObjectName(backend.Name), - Namespace: gatewayapi.NamespacePtr(backend.Namespace), - }) { - continue - } - // Discard Status to reduce memory consumption in watchable - // It will be recomputed by the gateway-api layer - backend.Status = egv1a1.BackendStatus{} - resourceMappings.allAssociatedNamespaces.Insert(backend.Namespace) - resourceMappings.allAssociatedBackends.Insert(utils.NamespacedName(&backend).String()) - // Backend might also be added in processBackendRefs. Make sure that we don't add it twice. - resourceTree.Backends = append(resourceTree.Backends, &backend) - } - return nil -} - // removeFinalizer removes the gatewayclass finalizer from the provided gc, if it exists. func (r *gatewayAPIReconciler) removeFinalizer(ctx context.Context, gc *gwapiv1.GatewayClass) error { if slice.ContainsString(gc.Finalizers, gatewayClassFinalizer) {