diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutor.java index f32192e839..98c6789869 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowCleanupExecutor.java @@ -104,16 +104,20 @@ public void run() { ((Deleter

) dependentResourceNode.getDependentResource()).delete(primary, context); deleteCalled.add(dependentResourceNode); } - alreadyVisited.add(dependentResourceNode); boolean deletePostConditionMet = deletePostCondition.map(c -> c.isMet(primary, dependentResourceNode.getDependentResource().getSecondaryResource(primary) .orElse(null), context)).orElse(true); + if (deletePostConditionMet) { + alreadyVisited.add(dependentResourceNode); handleDependentCleaned(dependentResourceNode); } else { + // updating alreadyVisited needs to be the last operation otherwise could lead to a race + // condition in handleCleanup condition checks postDeleteConditionNotMet.add(dependentResourceNode); + alreadyVisited.add(dependentResourceNode); } } catch (RuntimeException e) { handleExceptionInExecutor(dependentResourceNode, e); diff --git a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutor.java b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutor.java index cf209c3cea..14028cb980 100644 --- a/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutor.java +++ b/operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/dependent/workflow/WorkflowReconcileExecutor.java @@ -217,6 +217,8 @@ public void run() { alreadyVisited.add(dependentResourceNode); handleDependentDeleted(dependentResourceNode); } else { + // updating alreadyVisited needs to be the last operation otherwise could lead to a race + // condition in handleDelete condition checks deletePostConditionNotMet.add(dependentResourceNode); alreadyVisited.add(dependentResourceNode); }