From 8b5488ffa9b86ac612ea67bb89e47e1fe1e51c5b Mon Sep 17 00:00:00 2001 From: Xinzhao Xu Date: Wed, 26 Apr 2023 10:22:28 +0800 Subject: [PATCH] [release-3.3] controller/cluster: retry when updating the KubeFedCluster conflicted (#5655) controller/cluster: retry when updating the KubeFedCluster conflicted --- pkg/controller/cluster/cluster_controller.go | 5 +++++ pkg/controller/cluster/join.go | 21 ++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/pkg/controller/cluster/cluster_controller.go b/pkg/controller/cluster/cluster_controller.go index 7d7812c4c..5b70d35e4 100644 --- a/pkg/controller/cluster/cluster_controller.go +++ b/pkg/controller/cluster/cluster_controller.go @@ -407,6 +407,11 @@ func (c *clusterController) syncCluster(key string) error { } else { // join federation _, err = c.joinFederation(clusterConfig, cluster.Name, cluster.Labels) if err != nil { + if errors.IsConflict(err) { + klog.Warningf("update KubeFedCluster %s conflicted, retrying", cluster.Name) + return err + } + klog.Errorf("Failed to join federation for cluster %s, error %v", cluster.Name, err) federationNotReadyCondition := clusterv1alpha1.ClusterCondition{ diff --git a/pkg/controller/cluster/join.go b/pkg/controller/cluster/join.go index c008a5c2f..0d18a6be5 100644 --- a/pkg/controller/cluster/join.go +++ b/pkg/controller/cluster/join.go @@ -34,6 +34,7 @@ import ( kubeclient "k8s.io/client-go/kubernetes" k8sscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" + "k8s.io/client-go/util/retry" "k8s.io/klog" "sigs.k8s.io/controller-runtime/pkg/client" fedapis "sigs.k8s.io/kubefed/pkg/apis" @@ -199,25 +200,25 @@ func createKubeFedCluster(clusterConfig *rest.Config, client client.Client, join case err == nil && errorOnExisting: return nil, errors.Errorf("federated cluster %s already exists in host cluster", joiningClusterName) case err == nil: - existingFedCluster.Spec = fedCluster.Spec - existingFedCluster.Labels = labels - err = client.Update(context.TODO(), existingFedCluster) - if err != nil { + if retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error { + if err = client.Get(context.TODO(), key, existingFedCluster); err != nil { + return err + } + existingFedCluster.Spec = fedCluster.Spec + existingFedCluster.Labels = labels + return client.Update(context.TODO(), existingFedCluster) + }); retryErr != nil { klog.V(2).Infof("Could not update federated cluster %s due to %v", fedCluster.Name, err) return nil, err } return existingFedCluster, nil default: - - err = checkWorkspaces(clusterConfig, client, fedCluster) - - if err != nil { + if err = checkWorkspaces(clusterConfig, client, fedCluster); err != nil { klog.V(2).Infof("Validate federated cluster %s failed due to %v", fedCluster.Name, err) return nil, err } - err = client.Create(context.TODO(), fedCluster) - if err != nil { + if err = client.Create(context.TODO(), fedCluster); err != nil { klog.V(2).Infof("Could not create federated cluster %s due to %v", fedCluster.Name, err) return nil, err }