@@ -85,12 +85,10 @@ func (c *kubernetesBindingsController) EnableKubernetesBindings() ([]BindingExec
85
85
if err != nil {
86
86
return nil , fmt .Errorf ("run monitor: %s" , err )
87
87
}
88
- c .l .Lock ()
89
- c .BindingMonitorLinks [config .Monitor .Metadata .MonitorId ] = & KubernetesBindingToMonitorLink {
88
+ c .setBindingMonitorLinks (config .Monitor .Metadata .MonitorId , & KubernetesBindingToMonitorLink {
90
89
MonitorId : config .Monitor .Metadata .MonitorId ,
91
90
BindingConfig : config ,
92
- }
93
- c .l .Unlock ()
91
+ })
94
92
// Start monitor's informers to fill the cache.
95
93
c .kubeEventsManager .StartMonitor (config .Monitor .Metadata .MonitorId )
96
94
@@ -106,9 +104,7 @@ func (c *kubernetesBindingsController) EnableKubernetesBindings() ([]BindingExec
106
104
107
105
func (c * kubernetesBindingsController ) UpdateMonitor (monitorId string , kind , apiVersion string ) error {
108
106
// Find binding for monitorId
109
- c .l .RLock ()
110
- link , ok := c .BindingMonitorLinks [monitorId ]
111
- c .l .RUnlock ()
107
+ link , ok := c .getBindingMonitorLinksById (monitorId )
112
108
if ! ok {
113
109
return nil
114
110
}
@@ -158,12 +154,11 @@ func (c *kubernetesBindingsController) UpdateMonitor(monitorId string, kind, api
158
154
159
155
// UnlockEvents turns on eventCb for all monitors to emit events after Synchronization.
160
156
func (c * kubernetesBindingsController ) UnlockEvents () {
161
- c .l .RLock ()
162
- for monitorID := range c .BindingMonitorLinks {
157
+ c .iterateBindingMonitorLinks (func (monitorID string ) bool {
163
158
m := c .kubeEventsManager .GetMonitor (monitorID )
164
159
m .EnableKubeEventCb ()
165
- }
166
- c . l . RUnlock ( )
160
+ return false
161
+ } )
167
162
}
168
163
169
164
// UnlockEventsFor turns on eventCb for matched monitor to emit events after Synchronization.
@@ -179,30 +174,53 @@ func (c *kubernetesBindingsController) UnlockEventsFor(monitorID string) {
179
174
// StopMonitors stops all monitors for the hook.
180
175
// TODO handle error!
181
176
func (c * kubernetesBindingsController ) StopMonitors () {
182
- c .l .RLock ()
183
- for monitorID := range c .BindingMonitorLinks {
177
+ c .iterateBindingMonitorLinks (func (monitorID string ) bool {
184
178
_ = c .kubeEventsManager .StopMonitor (monitorID )
185
- }
186
- c . l . RUnlock ( )
179
+ return false
180
+ } )
187
181
}
188
182
189
183
func (c * kubernetesBindingsController ) CanHandleEvent (kubeEvent kemtypes.KubeEvent ) bool {
190
- c .l .RLock ()
191
- defer c .l .RUnlock ()
192
- for key := range c .BindingMonitorLinks {
193
- if key == kubeEvent .MonitorId {
184
+ var canHandleEvent bool
185
+
186
+ c .iterateBindingMonitorLinks (func (monitorID string ) bool {
187
+ if monitorID == kubeEvent .MonitorId {
188
+ canHandleEvent = true
194
189
return true
195
190
}
191
+ return false
192
+ })
193
+
194
+ return canHandleEvent
195
+ }
196
+
197
+ func (c * kubernetesBindingsController ) iterateBindingMonitorLinks (doFn func (monitorID string ) bool ) {
198
+ c .l .RLock ()
199
+ for monitorID := range c .BindingMonitorLinks {
200
+ if exit := doFn (monitorID ); exit {
201
+ break
202
+ }
196
203
}
197
- return false
204
+ c .l .RUnlock ()
205
+ }
206
+
207
+ func (c * kubernetesBindingsController ) getBindingMonitorLinksById (monitorId string ) (* KubernetesBindingToMonitorLink , bool ) {
208
+ c .l .RLock ()
209
+ link , found := c .BindingMonitorLinks [monitorId ]
210
+ c .l .RUnlock ()
211
+ return link , found
212
+ }
213
+
214
+ func (c * kubernetesBindingsController ) setBindingMonitorLinks (monitorId string , link * KubernetesBindingToMonitorLink ) {
215
+ c .l .Lock ()
216
+ c .BindingMonitorLinks [monitorId ] = link
217
+ c .l .Unlock ()
198
218
}
199
219
200
220
// HandleEvent receives event from KubeEventManager and returns a BindingExecutionInfo
201
221
// to help create a new task to run a hook.
202
222
func (c * kubernetesBindingsController ) HandleEvent (kubeEvent kemtypes.KubeEvent ) BindingExecutionInfo {
203
- c .l .RLock ()
204
- link , hasKey := c .BindingMonitorLinks [kubeEvent .MonitorId ]
205
- c .l .RUnlock ()
223
+ link , hasKey := c .getBindingMonitorLinksById (kubeEvent .MonitorId )
206
224
if ! hasKey {
207
225
log .Error ("Possible bug!!! Unknown kube event: no such monitor id registered" , slog .String ("monitorID" , kubeEvent .MonitorId ))
208
226
return BindingExecutionInfo {
0 commit comments