diff --git a/workflow/gccontroller/gc_controller.go b/workflow/gccontroller/gc_controller.go index 05da97603671..e65e333dc8be 100644 --- a/workflow/gccontroller/gc_controller.go +++ b/workflow/gccontroller/gc_controller.go @@ -211,9 +211,24 @@ func (c *Controller) deleteWorkflow(ctx context.Context, key string) error { // It should be impossible for a workflow to have been queue without a valid key. namespace, name, _ := cache.SplitMetaNamespaceKey(key) + // Double check to fix retry-with-ttl bug (#12626). + wf, err := c.wfclientset.ArgoprojV1alpha1().Workflows(namespace).Get(ctx, name, metav1.GetOptions{}) + if err != nil { + if apierr.IsNotFound(err) { + log.Infof("Workflow already deleted '%s'", key) + return nil + } else { + return err + } + } + if !(wf.Status.Failed() || wf.Status.Successful() || wf.Status.Phase.Completed()) { + log.Infof("Workflow '%s' is not completed due to a retry operation, ignore deletion", key) + return nil + } + // Any workflow that was queued must need deleting, therefore we do not check the expiry again. log.Infof("Deleting garbage collected workflow '%s'", key) - err := c.wfclientset.ArgoprojV1alpha1().Workflows(namespace).Delete(ctx, name, metav1.DeleteOptions{PropagationPolicy: commonutil.GetDeletePropagation()}) + err = c.wfclientset.ArgoprojV1alpha1().Workflows(namespace).Delete(ctx, name, metav1.DeleteOptions{PropagationPolicy: commonutil.GetDeletePropagation()}) if err != nil { if apierr.IsNotFound(err) { log.Infof("Workflow already deleted '%s'", key)