Repository navigation
Description
/area API
/kind bug
This is a largely superficial issue, which I only noticed because of some unit testing I was writing and trying to explain this odd behavior.
Expected Behavior
If in FinalizeKind a resource is marked Ready, and nil is returned, then we see both updates (path for finalizer, update status for Ready).
Actual Behavior
Instead the finalizer is removed and the status is NOT updated.
The bug
Using Deployment as an example... If in FinalizeKind we update status and return nil then we will call through here:
pkg/client/injection/kube/reconciler/apps/v1beta1/deployment/reconciler.go
Lines 242 to 244 in bfab3c8
| if resource, err = r.clearFinalizer(ctx, resource, reconcileEvent); err != nil { | |
| return fmt.Errorf("failed to clear finalizers: %w", err) | |
| } |
This function uses the input resource (with the updated status) to access the finalizers, find ours and remove it:
pkg/client/injection/kube/reconciler/apps/v1beta1/deployment/reconciler.go
Lines 438 to 441 in bfab3c8
| resource.Finalizers = finalizers.List() | |
| // Synchronize the finalizers filtered by r.finalizerName. | |
| return r.updateFinalizersFiltered(ctx, resource) |
The resource we pass in is used to compute a PATCH on the finalizers specifically:
pkg/client/injection/kube/reconciler/apps/v1beta1/deployment/reconciler.go
Lines 373 to 378 in bfab3c8
| mergePatch := map[string]interface{}{ | |
| "metadata": map[string]interface{}{ | |
| "finalizers": finalizers, | |
| "resourceVersion": existing.ResourceVersion, | |
| }, | |
| } |
However, any other mutations (e.g. our status update) are ignored here. This is a problem because the resource that is returned by this function is the updated copy that is returned by the PATCH which does not have our status update reflected:
pkg/client/injection/kube/reconciler/apps/v1beta1/deployment/reconciler.go
Lines 388 to 396 in bfab3c8
| updated, err := patcher.Patch(ctx, resourceName, types.MergePatchType, patch, metav1.PatchOptions{}) | |
| if err != nil { | |
| r.Recorder.Eventf(existing, v1.EventTypeWarning, "FinalizerUpdateFailed", | |
| "Failed to update finalizers for %q: %v", resourceName, err) | |
| } else { | |
| r.Recorder.Eventf(updated, v1.EventTypeNormal, "FinalizerUpdate", | |
| "Updated %q finalizers", resource.GetName()) | |
| } | |
| return updated, err |
Activity
mattmoor commentedon May 17, 2022
I think the best "fix" for this would be to not return
updateddirectly, but to reflect itsresourceVersionchange back toresourceand return that so the status is preserved.mattmoor commentedon May 17, 2022
cc @dprotaso @n3wscott
github-actions commentedon Aug 16, 2022
This issue is stale because it has been open for 90 days with no
activity. It will automatically close after 30 more days of
inactivity. Reopen the issue with
/reopen. Mark the issue asfresh by adding the comment
/remove-lifecycle stale.psschwei commentedon Aug 16, 2022
/lifecycle frozen