From e17660d87bca74fba14aa18c6c55d6d81b613f0a Mon Sep 17 00:00:00 2001 From: barbierajput378-pixel Date: Sat, 27 Jun 2026 17:22:29 +0530 Subject: [PATCH 1/2] fix: prevent duplicate objects in FetchResourceTemplatesByLabelSelector When cache fails and falls back to API server, the function was appending both the fallback results AND the original (empty) cache results, causing duplicates. Add a usedFallback flag to track when fallback is used, and only append cache objects if fallback was not used. Fixes #7670 Signed-off-by: barbierajput378-pixel --- pkg/util/helper/binding.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pkg/util/helper/binding.go b/pkg/util/helper/binding.go index 107e21246b7d..aa99daba05f2 100644 --- a/pkg/util/helper/binding.go +++ b/pkg/util/helper/binding.go @@ -357,8 +357,10 @@ func FetchResourceTemplatesByLabelSelector( objectList, err = informerManager.Lister(gvr).ByNamespace(resource.Namespace).List(selector) } var objects []*unstructured.Unstructured + usedFallback := false if err != nil || len(objectList) == 0 { // fall back to call api server in case the cache has not been synchronized yet + usedFallback = true klog.Warningf("Failed to get resource template (%s/%s/%s) from cache, Error: %v. Fall back to call api server.", resource.Kind, resource.Namespace, resource.Name, err) unstructuredList, err := dynamicClient.Resource(gvr).Namespace(resource.Namespace).List(context.TODO(), metav1.ListOptions{LabelSelector: selector.String()}) @@ -372,13 +374,15 @@ func FetchResourceTemplatesByLabelSelector( } } - for i := range objectList { - unstructuredObj, err := ToUnstructured(objectList[i]) - if err != nil { - klog.Errorf("Failed to transform object(%s/%s), Error: %v", resource.Namespace, resource.Name, err) - return nil, err + if !usedFallback { + for i := range objectList { + unstructuredObj, err := ToUnstructured(objectList[i]) + if err != nil { + klog.Errorf("Failed to transform object(%s/%s), Error: %v", resource.Namespace, resource.Name, err) + return nil, err + } + objects = append(objects, unstructuredObj) } - objects = append(objects, unstructuredObj) } return objects, nil } From a27ab2a44422587c7cb58b8968c90b4dbbcd1cc0 Mon Sep 17 00:00:00 2001 From: barbierajput378-pixel Date: Sat, 27 Jun 2026 21:45:32 +0530 Subject: [PATCH 2/2] refactor: simplify FetchResourceTemplatesByLabelSelector by using early return Signed-off-by: barbierajput378-pixel --- pkg/util/helper/binding.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/pkg/util/helper/binding.go b/pkg/util/helper/binding.go index aa99daba05f2..1650a77322d6 100644 --- a/pkg/util/helper/binding.go +++ b/pkg/util/helper/binding.go @@ -357,10 +357,8 @@ func FetchResourceTemplatesByLabelSelector( objectList, err = informerManager.Lister(gvr).ByNamespace(resource.Namespace).List(selector) } var objects []*unstructured.Unstructured - usedFallback := false if err != nil || len(objectList) == 0 { - // fall back to call api server in case the cache has not been synchronized yet - usedFallback = true + // fall back to call api server klog.Warningf("Failed to get resource template (%s/%s/%s) from cache, Error: %v. Fall back to call api server.", resource.Kind, resource.Namespace, resource.Name, err) unstructuredList, err := dynamicClient.Resource(gvr).Namespace(resource.Namespace).List(context.TODO(), metav1.ListOptions{LabelSelector: selector.String()}) @@ -372,17 +370,17 @@ func FetchResourceTemplatesByLabelSelector( for i := range unstructuredList.Items { objects = append(objects, &unstructuredList.Items[i]) } + return objects, nil } - if !usedFallback { - for i := range objectList { - unstructuredObj, err := ToUnstructured(objectList[i]) - if err != nil { - klog.Errorf("Failed to transform object(%s/%s), Error: %v", resource.Namespace, resource.Name, err) - return nil, err - } - objects = append(objects, unstructuredObj) + // Process cache objects + for i := range objectList { + unstructuredObj, err := ToUnstructured(objectList[i]) + if err != nil { + klog.Errorf("Failed to transform object(%s/%s), Error: %v", resource.Namespace, resource.Name, err) + return nil, err } + objects = append(objects, unstructuredObj) } return objects, nil }