From fba1260fe055d7023f9726f529db7a5131564886 Mon Sep 17 00:00:00 2001 From: Alejandro Ruiz Date: Thu, 9 Nov 2023 17:15:25 +0100 Subject: [PATCH] Upgrade wrangler to fix race condition and use resource version --- go.mod | 2 +- go.sum | 4 ++-- .../fleet.cattle.io/v1alpha1/bundle.go | 19 +++++++++---------- .../v1alpha1/bundledeployment.go | 19 +++++++++---------- .../fleet.cattle.io/v1alpha1/cluster.go | 19 +++++++++---------- .../fleet.cattle.io/v1alpha1/clustergroup.go | 19 +++++++++---------- .../v1alpha1/clusterregistration.go | 19 +++++++++---------- .../v1alpha1/clusterregistrationtoken.go | 19 +++++++++---------- .../fleet.cattle.io/v1alpha1/gitrepo.go | 19 +++++++++---------- .../fleet.cattle.io/v1alpha1/imagescan.go | 19 +++++++++---------- 10 files changed, 75 insertions(+), 83 deletions(-) diff --git a/go.mod b/go.mod index 1b3c627e5c..3f5dba3c09 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/rancher/fleet go 1.19 // Use changes from https://github.com/aruiz14/wrangler/commits/v1.1.1-debug-1842 -replace github.com/rancher/wrangler => github.com/aruiz14/wrangler v1.1.2-0.20231108100522-b20191ad7a9c +replace github.com/rancher/wrangler => github.com/aruiz14/wrangler v1.1.2-0.20231110113925-46de5facad2e replace ( github.com/rancher/fleet/pkg/apis => ./pkg/apis diff --git a/go.sum b/go.sum index 39d816ed4b..4383b37ea4 100644 --- a/go.sum +++ b/go.sum @@ -252,8 +252,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aruiz14/wrangler v1.1.2-0.20231108100522-b20191ad7a9c h1:QhX+jGL6PUClbp3a6ehVzSoN9RmWTt3O2nypN5AJEy8= -github.com/aruiz14/wrangler v1.1.2-0.20231108100522-b20191ad7a9c/go.mod h1:ioVbKupzcBOdzsl55MvEDN0R1wdGggj8iNCYGFI5JvM= +github.com/aruiz14/wrangler v1.1.2-0.20231110113925-46de5facad2e h1:ynnMBenEwXiti5AbVkqjwaGLtvaZ6fB8vf0zQqo0SA4= +github.com/aruiz14/wrangler v1.1.2-0.20231110113925-46de5facad2e/go.mod h1:ioVbKupzcBOdzsl55MvEDN0R1wdGggj8iNCYGFI5JvM= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= diff --git a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/bundle.go b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/bundle.go index 425de02f94..9eeca8c280 100644 --- a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/bundle.go +++ b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/bundle.go @@ -20,6 +20,7 @@ package v1alpha1 import ( "context" + "sync" "time" v1alpha1 "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" @@ -283,7 +284,6 @@ func RegisterBundleGeneratingHandler(ctx context.Context, controller BundleContr apply: apply, name: name, gvk: controller.GroupVersionKind(), - seen: make(map[string]struct{}), } if opts != nil { statusHandler.opts = *opts @@ -343,7 +343,7 @@ type bundleGeneratingHandler struct { opts generic.GeneratingHandlerOptions gvk schema.GroupVersionKind name string - seen map[string]struct{} + seen sync.Map } func (a *bundleGeneratingHandler) Remove(key string, obj *v1alpha1.Bundle) (*v1alpha1.Bundle, error) { @@ -354,7 +354,8 @@ func (a *bundleGeneratingHandler) Remove(key string, obj *v1alpha1.Bundle) (*v1a obj = &v1alpha1.Bundle{} obj.Namespace, obj.Name = kv.RSplit(key, "/") obj.SetGroupVersionKind(a.gvk) - delete(a.seen, key) + + a.seen.Delete(key) return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). WithOwner(obj). @@ -368,7 +369,7 @@ func (a *bundleGeneratingHandler) Handle(obj *v1alpha1.Bundle, status v1alpha1.B } objs, newStatus, err := a.BundleGeneratingHandler(obj, status) - if err != nil || !a.shouldApply(obj, newStatus) { + if err != nil || !a.shouldApply(obj) { return newStatus, err } @@ -378,11 +379,9 @@ func (a *bundleGeneratingHandler) Handle(obj *v1alpha1.Bundle, status v1alpha1.B ApplyObjects(objs...) } -func (a *bundleGeneratingHandler) shouldApply(obj *v1alpha1.Bundle, status v1alpha1.BundleStatus) bool { +func (a *bundleGeneratingHandler) shouldApply(obj *v1alpha1.Bundle) bool { + // Apply once per resource version key := obj.Namespace + "/" + obj.Name - if _, seen := a.seen[key]; !seen { - a.seen[key] = struct{}{} - return true - } - return !equality.Semantic.DeepEqual(obj.Status, status) + previous, ok := a.seen.Swap(key, obj.ResourceVersion) + return !ok || previous != obj.ResourceVersion } diff --git a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/bundledeployment.go b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/bundledeployment.go index ab9bba8050..83dcf2b043 100644 --- a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/bundledeployment.go +++ b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/bundledeployment.go @@ -20,6 +20,7 @@ package v1alpha1 import ( "context" + "sync" "time" v1alpha1 "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" @@ -283,7 +284,6 @@ func RegisterBundleDeploymentGeneratingHandler(ctx context.Context, controller B apply: apply, name: name, gvk: controller.GroupVersionKind(), - seen: make(map[string]struct{}), } if opts != nil { statusHandler.opts = *opts @@ -343,7 +343,7 @@ type bundleDeploymentGeneratingHandler struct { opts generic.GeneratingHandlerOptions gvk schema.GroupVersionKind name string - seen map[string]struct{} + seen sync.Map } func (a *bundleDeploymentGeneratingHandler) Remove(key string, obj *v1alpha1.BundleDeployment) (*v1alpha1.BundleDeployment, error) { @@ -354,7 +354,8 @@ func (a *bundleDeploymentGeneratingHandler) Remove(key string, obj *v1alpha1.Bun obj = &v1alpha1.BundleDeployment{} obj.Namespace, obj.Name = kv.RSplit(key, "/") obj.SetGroupVersionKind(a.gvk) - delete(a.seen, key) + + a.seen.Delete(key) return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). WithOwner(obj). @@ -368,7 +369,7 @@ func (a *bundleDeploymentGeneratingHandler) Handle(obj *v1alpha1.BundleDeploymen } objs, newStatus, err := a.BundleDeploymentGeneratingHandler(obj, status) - if err != nil || !a.shouldApply(obj, newStatus) { + if err != nil || !a.shouldApply(obj) { return newStatus, err } @@ -378,11 +379,9 @@ func (a *bundleDeploymentGeneratingHandler) Handle(obj *v1alpha1.BundleDeploymen ApplyObjects(objs...) } -func (a *bundleDeploymentGeneratingHandler) shouldApply(obj *v1alpha1.BundleDeployment, status v1alpha1.BundleDeploymentStatus) bool { +func (a *bundleDeploymentGeneratingHandler) shouldApply(obj *v1alpha1.BundleDeployment) bool { + // Apply once per resource version key := obj.Namespace + "/" + obj.Name - if _, seen := a.seen[key]; !seen { - a.seen[key] = struct{}{} - return true - } - return !equality.Semantic.DeepEqual(obj.Status, status) + previous, ok := a.seen.Swap(key, obj.ResourceVersion) + return !ok || previous != obj.ResourceVersion } diff --git a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/cluster.go b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/cluster.go index 91412c2f43..52e7b61990 100644 --- a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/cluster.go +++ b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/cluster.go @@ -20,6 +20,7 @@ package v1alpha1 import ( "context" + "sync" "time" v1alpha1 "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" @@ -283,7 +284,6 @@ func RegisterClusterGeneratingHandler(ctx context.Context, controller ClusterCon apply: apply, name: name, gvk: controller.GroupVersionKind(), - seen: make(map[string]struct{}), } if opts != nil { statusHandler.opts = *opts @@ -343,7 +343,7 @@ type clusterGeneratingHandler struct { opts generic.GeneratingHandlerOptions gvk schema.GroupVersionKind name string - seen map[string]struct{} + seen sync.Map } func (a *clusterGeneratingHandler) Remove(key string, obj *v1alpha1.Cluster) (*v1alpha1.Cluster, error) { @@ -354,7 +354,8 @@ func (a *clusterGeneratingHandler) Remove(key string, obj *v1alpha1.Cluster) (*v obj = &v1alpha1.Cluster{} obj.Namespace, obj.Name = kv.RSplit(key, "/") obj.SetGroupVersionKind(a.gvk) - delete(a.seen, key) + + a.seen.Delete(key) return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). WithOwner(obj). @@ -368,7 +369,7 @@ func (a *clusterGeneratingHandler) Handle(obj *v1alpha1.Cluster, status v1alpha1 } objs, newStatus, err := a.ClusterGeneratingHandler(obj, status) - if err != nil || !a.shouldApply(obj, newStatus) { + if err != nil || !a.shouldApply(obj) { return newStatus, err } @@ -378,11 +379,9 @@ func (a *clusterGeneratingHandler) Handle(obj *v1alpha1.Cluster, status v1alpha1 ApplyObjects(objs...) } -func (a *clusterGeneratingHandler) shouldApply(obj *v1alpha1.Cluster, status v1alpha1.ClusterStatus) bool { +func (a *clusterGeneratingHandler) shouldApply(obj *v1alpha1.Cluster) bool { + // Apply once per resource version key := obj.Namespace + "/" + obj.Name - if _, seen := a.seen[key]; !seen { - a.seen[key] = struct{}{} - return true - } - return !equality.Semantic.DeepEqual(obj.Status, status) + previous, ok := a.seen.Swap(key, obj.ResourceVersion) + return !ok || previous != obj.ResourceVersion } diff --git a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clustergroup.go b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clustergroup.go index 6c59022e92..1d3b30dddd 100644 --- a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clustergroup.go +++ b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clustergroup.go @@ -20,6 +20,7 @@ package v1alpha1 import ( "context" + "sync" "time" v1alpha1 "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" @@ -283,7 +284,6 @@ func RegisterClusterGroupGeneratingHandler(ctx context.Context, controller Clust apply: apply, name: name, gvk: controller.GroupVersionKind(), - seen: make(map[string]struct{}), } if opts != nil { statusHandler.opts = *opts @@ -343,7 +343,7 @@ type clusterGroupGeneratingHandler struct { opts generic.GeneratingHandlerOptions gvk schema.GroupVersionKind name string - seen map[string]struct{} + seen sync.Map } func (a *clusterGroupGeneratingHandler) Remove(key string, obj *v1alpha1.ClusterGroup) (*v1alpha1.ClusterGroup, error) { @@ -354,7 +354,8 @@ func (a *clusterGroupGeneratingHandler) Remove(key string, obj *v1alpha1.Cluster obj = &v1alpha1.ClusterGroup{} obj.Namespace, obj.Name = kv.RSplit(key, "/") obj.SetGroupVersionKind(a.gvk) - delete(a.seen, key) + + a.seen.Delete(key) return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). WithOwner(obj). @@ -368,7 +369,7 @@ func (a *clusterGroupGeneratingHandler) Handle(obj *v1alpha1.ClusterGroup, statu } objs, newStatus, err := a.ClusterGroupGeneratingHandler(obj, status) - if err != nil || !a.shouldApply(obj, newStatus) { + if err != nil || !a.shouldApply(obj) { return newStatus, err } @@ -378,11 +379,9 @@ func (a *clusterGroupGeneratingHandler) Handle(obj *v1alpha1.ClusterGroup, statu ApplyObjects(objs...) } -func (a *clusterGroupGeneratingHandler) shouldApply(obj *v1alpha1.ClusterGroup, status v1alpha1.ClusterGroupStatus) bool { +func (a *clusterGroupGeneratingHandler) shouldApply(obj *v1alpha1.ClusterGroup) bool { + // Apply once per resource version key := obj.Namespace + "/" + obj.Name - if _, seen := a.seen[key]; !seen { - a.seen[key] = struct{}{} - return true - } - return !equality.Semantic.DeepEqual(obj.Status, status) + previous, ok := a.seen.Swap(key, obj.ResourceVersion) + return !ok || previous != obj.ResourceVersion } diff --git a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clusterregistration.go b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clusterregistration.go index 7df9d00baa..9f32bf25f4 100644 --- a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clusterregistration.go +++ b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clusterregistration.go @@ -20,6 +20,7 @@ package v1alpha1 import ( "context" + "sync" "time" v1alpha1 "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" @@ -283,7 +284,6 @@ func RegisterClusterRegistrationGeneratingHandler(ctx context.Context, controlle apply: apply, name: name, gvk: controller.GroupVersionKind(), - seen: make(map[string]struct{}), } if opts != nil { statusHandler.opts = *opts @@ -343,7 +343,7 @@ type clusterRegistrationGeneratingHandler struct { opts generic.GeneratingHandlerOptions gvk schema.GroupVersionKind name string - seen map[string]struct{} + seen sync.Map } func (a *clusterRegistrationGeneratingHandler) Remove(key string, obj *v1alpha1.ClusterRegistration) (*v1alpha1.ClusterRegistration, error) { @@ -354,7 +354,8 @@ func (a *clusterRegistrationGeneratingHandler) Remove(key string, obj *v1alpha1. obj = &v1alpha1.ClusterRegistration{} obj.Namespace, obj.Name = kv.RSplit(key, "/") obj.SetGroupVersionKind(a.gvk) - delete(a.seen, key) + + a.seen.Delete(key) return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). WithOwner(obj). @@ -368,7 +369,7 @@ func (a *clusterRegistrationGeneratingHandler) Handle(obj *v1alpha1.ClusterRegis } objs, newStatus, err := a.ClusterRegistrationGeneratingHandler(obj, status) - if err != nil || !a.shouldApply(obj, newStatus) { + if err != nil || !a.shouldApply(obj) { return newStatus, err } @@ -378,11 +379,9 @@ func (a *clusterRegistrationGeneratingHandler) Handle(obj *v1alpha1.ClusterRegis ApplyObjects(objs...) } -func (a *clusterRegistrationGeneratingHandler) shouldApply(obj *v1alpha1.ClusterRegistration, status v1alpha1.ClusterRegistrationStatus) bool { +func (a *clusterRegistrationGeneratingHandler) shouldApply(obj *v1alpha1.ClusterRegistration) bool { + // Apply once per resource version key := obj.Namespace + "/" + obj.Name - if _, seen := a.seen[key]; !seen { - a.seen[key] = struct{}{} - return true - } - return !equality.Semantic.DeepEqual(obj.Status, status) + previous, ok := a.seen.Swap(key, obj.ResourceVersion) + return !ok || previous != obj.ResourceVersion } diff --git a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clusterregistrationtoken.go b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clusterregistrationtoken.go index ac6c3f938a..d14a04c84a 100644 --- a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clusterregistrationtoken.go +++ b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/clusterregistrationtoken.go @@ -20,6 +20,7 @@ package v1alpha1 import ( "context" + "sync" "time" v1alpha1 "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" @@ -283,7 +284,6 @@ func RegisterClusterRegistrationTokenGeneratingHandler(ctx context.Context, cont apply: apply, name: name, gvk: controller.GroupVersionKind(), - seen: make(map[string]struct{}), } if opts != nil { statusHandler.opts = *opts @@ -343,7 +343,7 @@ type clusterRegistrationTokenGeneratingHandler struct { opts generic.GeneratingHandlerOptions gvk schema.GroupVersionKind name string - seen map[string]struct{} + seen sync.Map } func (a *clusterRegistrationTokenGeneratingHandler) Remove(key string, obj *v1alpha1.ClusterRegistrationToken) (*v1alpha1.ClusterRegistrationToken, error) { @@ -354,7 +354,8 @@ func (a *clusterRegistrationTokenGeneratingHandler) Remove(key string, obj *v1al obj = &v1alpha1.ClusterRegistrationToken{} obj.Namespace, obj.Name = kv.RSplit(key, "/") obj.SetGroupVersionKind(a.gvk) - delete(a.seen, key) + + a.seen.Delete(key) return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). WithOwner(obj). @@ -368,7 +369,7 @@ func (a *clusterRegistrationTokenGeneratingHandler) Handle(obj *v1alpha1.Cluster } objs, newStatus, err := a.ClusterRegistrationTokenGeneratingHandler(obj, status) - if err != nil || !a.shouldApply(obj, newStatus) { + if err != nil || !a.shouldApply(obj) { return newStatus, err } @@ -378,11 +379,9 @@ func (a *clusterRegistrationTokenGeneratingHandler) Handle(obj *v1alpha1.Cluster ApplyObjects(objs...) } -func (a *clusterRegistrationTokenGeneratingHandler) shouldApply(obj *v1alpha1.ClusterRegistrationToken, status v1alpha1.ClusterRegistrationTokenStatus) bool { +func (a *clusterRegistrationTokenGeneratingHandler) shouldApply(obj *v1alpha1.ClusterRegistrationToken) bool { + // Apply once per resource version key := obj.Namespace + "/" + obj.Name - if _, seen := a.seen[key]; !seen { - a.seen[key] = struct{}{} - return true - } - return !equality.Semantic.DeepEqual(obj.Status, status) + previous, ok := a.seen.Swap(key, obj.ResourceVersion) + return !ok || previous != obj.ResourceVersion } diff --git a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/gitrepo.go b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/gitrepo.go index 53b085656b..728267fe8c 100644 --- a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/gitrepo.go +++ b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/gitrepo.go @@ -20,6 +20,7 @@ package v1alpha1 import ( "context" + "sync" "time" v1alpha1 "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" @@ -283,7 +284,6 @@ func RegisterGitRepoGeneratingHandler(ctx context.Context, controller GitRepoCon apply: apply, name: name, gvk: controller.GroupVersionKind(), - seen: make(map[string]struct{}), } if opts != nil { statusHandler.opts = *opts @@ -343,7 +343,7 @@ type gitRepoGeneratingHandler struct { opts generic.GeneratingHandlerOptions gvk schema.GroupVersionKind name string - seen map[string]struct{} + seen sync.Map } func (a *gitRepoGeneratingHandler) Remove(key string, obj *v1alpha1.GitRepo) (*v1alpha1.GitRepo, error) { @@ -354,7 +354,8 @@ func (a *gitRepoGeneratingHandler) Remove(key string, obj *v1alpha1.GitRepo) (*v obj = &v1alpha1.GitRepo{} obj.Namespace, obj.Name = kv.RSplit(key, "/") obj.SetGroupVersionKind(a.gvk) - delete(a.seen, key) + + a.seen.Delete(key) return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). WithOwner(obj). @@ -368,7 +369,7 @@ func (a *gitRepoGeneratingHandler) Handle(obj *v1alpha1.GitRepo, status v1alpha1 } objs, newStatus, err := a.GitRepoGeneratingHandler(obj, status) - if err != nil || !a.shouldApply(obj, newStatus) { + if err != nil || !a.shouldApply(obj) { return newStatus, err } @@ -378,11 +379,9 @@ func (a *gitRepoGeneratingHandler) Handle(obj *v1alpha1.GitRepo, status v1alpha1 ApplyObjects(objs...) } -func (a *gitRepoGeneratingHandler) shouldApply(obj *v1alpha1.GitRepo, status v1alpha1.GitRepoStatus) bool { +func (a *gitRepoGeneratingHandler) shouldApply(obj *v1alpha1.GitRepo) bool { + // Apply once per resource version key := obj.Namespace + "/" + obj.Name - if _, seen := a.seen[key]; !seen { - a.seen[key] = struct{}{} - return true - } - return !equality.Semantic.DeepEqual(obj.Status, status) + previous, ok := a.seen.Swap(key, obj.ResourceVersion) + return !ok || previous != obj.ResourceVersion } diff --git a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/imagescan.go b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/imagescan.go index 5715c663a1..4051d903b5 100644 --- a/pkg/generated/controllers/fleet.cattle.io/v1alpha1/imagescan.go +++ b/pkg/generated/controllers/fleet.cattle.io/v1alpha1/imagescan.go @@ -20,6 +20,7 @@ package v1alpha1 import ( "context" + "sync" "time" v1alpha1 "github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1" @@ -283,7 +284,6 @@ func RegisterImageScanGeneratingHandler(ctx context.Context, controller ImageSca apply: apply, name: name, gvk: controller.GroupVersionKind(), - seen: make(map[string]struct{}), } if opts != nil { statusHandler.opts = *opts @@ -343,7 +343,7 @@ type imageScanGeneratingHandler struct { opts generic.GeneratingHandlerOptions gvk schema.GroupVersionKind name string - seen map[string]struct{} + seen sync.Map } func (a *imageScanGeneratingHandler) Remove(key string, obj *v1alpha1.ImageScan) (*v1alpha1.ImageScan, error) { @@ -354,7 +354,8 @@ func (a *imageScanGeneratingHandler) Remove(key string, obj *v1alpha1.ImageScan) obj = &v1alpha1.ImageScan{} obj.Namespace, obj.Name = kv.RSplit(key, "/") obj.SetGroupVersionKind(a.gvk) - delete(a.seen, key) + + a.seen.Delete(key) return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). WithOwner(obj). @@ -368,7 +369,7 @@ func (a *imageScanGeneratingHandler) Handle(obj *v1alpha1.ImageScan, status v1al } objs, newStatus, err := a.ImageScanGeneratingHandler(obj, status) - if err != nil || !a.shouldApply(obj, newStatus) { + if err != nil || !a.shouldApply(obj) { return newStatus, err } @@ -378,11 +379,9 @@ func (a *imageScanGeneratingHandler) Handle(obj *v1alpha1.ImageScan, status v1al ApplyObjects(objs...) } -func (a *imageScanGeneratingHandler) shouldApply(obj *v1alpha1.ImageScan, status v1alpha1.ImageScanStatus) bool { +func (a *imageScanGeneratingHandler) shouldApply(obj *v1alpha1.ImageScan) bool { + // Apply once per resource version key := obj.Namespace + "/" + obj.Name - if _, seen := a.seen[key]; !seen { - a.seen[key] = struct{}{} - return true - } - return !equality.Semantic.DeepEqual(obj.Status, status) + previous, ok := a.seen.Swap(key, obj.ResourceVersion) + return !ok || previous != obj.ResourceVersion }