@@ -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+
227241func (r * OperatorReconciler ) unsetLastResourceVersion (name types.NamespacedName ) {
228242 r .mu .Lock ()
229243 defer r .mu .Unlock ()
0 commit comments