Skip to content
This repository was archived by the owner on Apr 25, 2023. It is now read-only.

Commit 89ef98e

Browse files
committed
use merge-patch on finalizer operations to resolve racing conflicts
Signed-off-by: Bruce Ma <[email protected]>
1 parent 440d5bf commit 89ef98e

File tree

2 files changed

+25
-31
lines changed

2 files changed

+25
-31
lines changed

pkg/controller/federatedtypeconfig/controller.go

+12-22
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ import (
2323

2424
"github.com/pkg/errors"
2525

26-
"k8s.io/apimachinery/pkg/api/meta"
2726
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2827
pkgruntime "k8s.io/apimachinery/pkg/runtime"
2928
"k8s.io/apimachinery/pkg/util/runtime"
30-
"k8s.io/apimachinery/pkg/util/sets"
3129
restclient "k8s.io/client-go/rest"
3230
"k8s.io/client-go/tools/cache"
3331
"k8s.io/klog/v2"
32+
"sigs.k8s.io/controller-runtime/pkg/client"
33+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3434

3535
corev1b1 "sigs.k8s.io/kubefed/pkg/apis/core/v1beta1"
3636
genericclient "sigs.k8s.io/kubefed/pkg/client/generic"
@@ -376,33 +376,23 @@ func (c *Controller) refreshSyncController(tc *corev1b1.FederatedTypeConfig) err
376376
}
377377

378378
func (c *Controller) ensureFinalizer(tc *corev1b1.FederatedTypeConfig) (bool, error) {
379-
accessor, err := meta.Accessor(tc)
380-
if err != nil {
381-
return false, err
382-
}
383-
finalizers := sets.NewString(accessor.GetFinalizers()...)
384-
if finalizers.Has(finalizer) {
379+
if controllerutil.ContainsFinalizer(tc, finalizer) {
385380
return false, nil
386381
}
387-
finalizers.Insert(finalizer)
388-
accessor.SetFinalizers(finalizers.List())
389-
err = c.client.Update(context.TODO(), tc)
390-
return true, err
382+
383+
patch := client.MergeFrom(tc.DeepCopy())
384+
controllerutil.AddFinalizer(tc, finalizer)
385+
return true, c.client.Patch(context.TODO(), tc, patch)
391386
}
392387

393388
func (c *Controller) removeFinalizer(tc *corev1b1.FederatedTypeConfig) error {
394-
accessor, err := meta.Accessor(tc)
395-
if err != nil {
396-
return err
397-
}
398-
finalizers := sets.NewString(accessor.GetFinalizers()...)
399-
if !finalizers.Has(finalizer) {
389+
if !controllerutil.ContainsFinalizer(tc, finalizer) {
400390
return nil
401391
}
402-
finalizers.Delete(finalizer)
403-
accessor.SetFinalizers(finalizers.List())
404-
err = c.client.Update(context.TODO(), tc)
405-
return err
392+
393+
patch := client.MergeFrom(tc.DeepCopy())
394+
controllerutil.RemoveFinalizer(tc, finalizer)
395+
return c.client.Patch(context.TODO(), tc, patch)
406396
}
407397

408398
func (c *Controller) namespaceFTCExists() bool {

pkg/controller/sync/controller.go

+13-9
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ import (
4040
"k8s.io/klog/v2"
4141

4242
"sigs.k8s.io/controller-runtime/pkg/client"
43+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4344

4445
"sigs.k8s.io/kubefed/pkg/apis/core/typeconfig"
4546
fedv1b1 "sigs.k8s.io/kubefed/pkg/apis/core/v1beta1"
4647
genericclient "sigs.k8s.io/kubefed/pkg/client/generic"
4748
"sigs.k8s.io/kubefed/pkg/controller/sync/dispatch"
4849
"sigs.k8s.io/kubefed/pkg/controller/sync/status"
4950
"sigs.k8s.io/kubefed/pkg/controller/util"
50-
finalizersutil "sigs.k8s.io/kubefed/pkg/controller/util/finalizers"
5151
"sigs.k8s.io/kubefed/pkg/metrics"
5252
)
5353

@@ -657,20 +657,24 @@ func (s *KubeFedSyncController) handleDeletionInClusters(gvk schema.GroupVersion
657657

658658
func (s *KubeFedSyncController) ensureFinalizer(fedResource FederatedResource) error {
659659
obj := fedResource.Object()
660-
isUpdated, err := finalizersutil.AddFinalizers(obj, sets.NewString(FinalizerSyncController))
661-
if err != nil || !isUpdated {
662-
return err
660+
if controllerutil.ContainsFinalizer(obj, FinalizerSyncController) {
661+
return nil
663662
}
663+
664+
patch := client.MergeFrom(obj.DeepCopy())
665+
controllerutil.AddFinalizer(obj, FinalizerSyncController)
664666
klog.V(2).Infof("Adding finalizer %s to %s %q", FinalizerSyncController, fedResource.FederatedKind(), fedResource.FederatedName())
665-
return s.hostClusterClient.Update(context.TODO(), obj)
667+
return s.hostClusterClient.Patch(context.TODO(), obj, patch)
666668
}
667669

668670
func (s *KubeFedSyncController) removeFinalizer(fedResource FederatedResource) error {
669671
obj := fedResource.Object()
670-
isUpdated, err := finalizersutil.RemoveFinalizers(obj, sets.NewString(FinalizerSyncController))
671-
if err != nil || !isUpdated {
672-
return err
672+
if !controllerutil.ContainsFinalizer(obj, FinalizerSyncController) {
673+
return nil
673674
}
675+
676+
patch := client.MergeFrom(obj.DeepCopy())
677+
controllerutil.RemoveFinalizer(obj, FinalizerSyncController)
674678
klog.V(2).Infof("Removing finalizer %s from %s %q", FinalizerSyncController, fedResource.FederatedKind(), fedResource.FederatedName())
675-
return s.hostClusterClient.Update(context.TODO(), obj)
679+
return s.hostClusterClient.Patch(context.TODO(), obj, patch)
676680
}

0 commit comments

Comments
 (0)