Skip to content

Commit 55e454a

Browse files
committed
fix race in Operator reconciliation
1 parent 8979865 commit 55e454a

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

pkg/controller/operators/operator_controller.go

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,16 @@ func (r *OperatorReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
130130
}
131131
}
132132

133-
if !create {
134-
if rv, ok := r.getLastResourceVersion(req.NamespacedName); ok && rv == in.ResourceVersion {
135-
log.V(1).Info("Operator is already up-to-date")
136-
return reconcile.Result{}, nil
137-
}
133+
rv, ok := r.getLastResourceVersion(req.NamespacedName)
134+
if !create && ok && rv == in.ResourceVersion {
135+
log.V(1).Info("Operator is already up-to-date")
136+
return reconcile.Result{}, nil
138137
}
139138

139+
// Set the cached resource version to 0 so we can handle
140+
// the race with requests enqueuing via mapComponentRequests
141+
r.setLastResourceVersion(req.NamespacedName, "0")
142+
140143
// Wrap with convenience decorator
141144
operator, err := r.factory.NewOperator(in)
142145
if err != nil {
@@ -162,7 +165,10 @@ func (r *OperatorReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
162165
}
163166
}
164167

165-
r.setLastResourceVersion(req.NamespacedName, operator.GetResourceVersion())
168+
// Only set the resource version if it already exists.
169+
// If it does not exist, it means mapComponentRequests was called
170+
// while we were reconciling and we need to reconcile again
171+
r.setLastResourceVersionIfExists(req.NamespacedName, operator.GetResourceVersion())
166172

167173
return ctrl.Result{}, nil
168174
}
@@ -224,6 +230,14 @@ func (r *OperatorReconciler) setLastResourceVersion(name types.NamespacedName, r
224230
r.lastResourceVersion[name] = rv
225231
}
226232

233+
func (r *OperatorReconciler) setLastResourceVersionIfExists(name types.NamespacedName, rv string) {
234+
r.mu.Lock()
235+
defer r.mu.Unlock()
236+
if _, ok := r.lastResourceVersion[name]; ok {
237+
r.lastResourceVersion[name] = rv
238+
}
239+
}
240+
227241
func (r *OperatorReconciler) unsetLastResourceVersion(name types.NamespacedName) {
228242
r.mu.Lock()
229243
defer r.mu.Unlock()

0 commit comments

Comments
 (0)