Skip to content

Commit fbab1a2

Browse files
committed
Use sync.Map for clusterNodeInformers
1 parent ea2cd28 commit fbab1a2

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

config/crd/bases/cluster.x-k8s.io_machinehealthchecks.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ spec:
6969
x-kubernetes-int-or-string: true
7070
nodeStartupTimeout:
7171
description: Machines older than this duration without a node will
72-
be considered to have failed and will be remediated
72+
be considered to have failed and will be remediated.
7373
type: string
7474
selector:
7575
description: Label selector to match machines whose health will be

controllers/machinehealthcheck_controller.go

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,10 @@ type MachineHealthCheckReconciler struct {
5757
Client client.Client
5858
Log logr.Logger
5959

60-
controller controller.Controller
61-
recorder record.EventRecorder
62-
scheme *runtime.Scheme
63-
clusterNodeInformers map[types.NamespacedName]cache.Informer
64-
clusterNodeInformersLock *sync.Mutex
60+
controller controller.Controller
61+
recorder record.EventRecorder
62+
scheme *runtime.Scheme
63+
clusterNodeInformers *sync.Map
6564
}
6665

6766
func (r *MachineHealthCheckReconciler) SetupWithManager(mgr ctrl.Manager, options controller.Options) error {
@@ -101,8 +100,7 @@ func (r *MachineHealthCheckReconciler) SetupWithManager(mgr ctrl.Manager, option
101100
r.controller = controller
102101
r.recorder = mgr.GetEventRecorderFor("machinehealthcheck-controller")
103102
r.scheme = mgr.GetScheme()
104-
r.clusterNodeInformers = make(map[types.NamespacedName]cache.Informer)
105-
r.clusterNodeInformersLock = &sync.Mutex{}
103+
r.clusterNodeInformers = &sync.Map{}
106104
return nil
107105
}
108106

@@ -345,11 +343,9 @@ func (r *MachineHealthCheckReconciler) getMachineFromNode(nodeName string) (*clu
345343

346344
func (r *MachineHealthCheckReconciler) watchClusterNodes(ctx context.Context, c client.Client, cluster *clusterv1.Cluster) error {
347345
// Ensure that concurrent reconciles don't clash when setting up watches
348-
r.clusterNodeInformersLock.Lock()
349-
defer r.clusterNodeInformersLock.Unlock()
350346

351347
key := util.ObjectKey(cluster)
352-
if _, ok := r.clusterNodeInformers[key]; ok {
348+
if _, ok := r.loadClusterNodeInformer(key); ok {
353349
// watch was already set up for this cluster
354350
return nil
355351
}
@@ -377,12 +373,24 @@ func (r *MachineHealthCheckReconciler) watchClusterNodes(ctx context.Context, c
377373
return errors.Wrap(err, "error watching nodes on target cluster")
378374
}
379375

380-
if r.clusterNodeInformers == nil {
381-
r.clusterNodeInformers = make(map[types.NamespacedName]cache.Informer)
376+
r.storeClusterNodeInformer(key, nodeInformer)
377+
return nil
378+
}
379+
380+
func (r *MachineHealthCheckReconciler) loadClusterNodeInformer(key client.ObjectKey) (cache.Informer, bool) {
381+
val, ok := r.clusterNodeInformers.Load(key)
382+
if !ok {
383+
return nil, false
382384
}
385+
informer, ok := val.(cache.Informer)
386+
if !ok {
387+
return nil, false
388+
}
389+
return informer, true
390+
}
383391

384-
r.clusterNodeInformers[key] = nodeInformer
385-
return nil
392+
func (r *MachineHealthCheckReconciler) storeClusterNodeInformer(key client.ObjectKey, nodeInformer cache.Informer) {
393+
r.clusterNodeInformers.Store(key, nodeInformer)
386394
}
387395

388396
func (r *MachineHealthCheckReconciler) indexMachineByNodeName(object runtime.Object) []string {

0 commit comments

Comments
 (0)