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 567f999ba9..cf209c3cea 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 @@ -35,7 +35,8 @@ public class WorkflowReconcileExecutor

{ new ConcurrentHashMap<>(); private final Set markedForDelete = ConcurrentHashMap.newKeySet(); - private final Set deleteConditionNotMet = ConcurrentHashMap.newKeySet(); + private final Set deletePostConditionNotMet = + ConcurrentHashMap.newKeySet(); // used to remember reconciled (not deleted or errored) dependents private final Set reconciled = ConcurrentHashMap.newKeySet(); private final Map reconcileResults = @@ -99,7 +100,7 @@ private synchronized void handleReconcile(DependentResourceNode depend } } - private void handleDelete(DependentResourceNode dependentResourceNode) { + private synchronized void handleDelete(DependentResourceNode dependentResourceNode) { log.debug("Submitting for delete: {}", dependentResourceNode); if (alreadyVisited(dependentResourceNode) @@ -119,7 +120,7 @@ private void handleDelete(DependentResourceNode dependentResourceNode) { private boolean allDependentsDeletedAlready(DependentResourceNode dependentResourceNode) { var dependents = dependentResourceNode.getParents(); return dependents.stream().allMatch(d -> alreadyVisited.contains(d) && !notReady.contains(d) - && !exceptionsDuringExecution.containsKey(d) && !deleteConditionNotMet.contains(d)); + && !exceptionsDuringExecution.containsKey(d) && !deletePostConditionNotMet.contains(d)); } @@ -207,16 +208,17 @@ public void run() { && !(dependentResource instanceof GarbageCollected)) { ((Deleter

) dependentResourceNode.getDependentResource()).delete(primary, context); } - 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); handleDependentDeleted(dependentResourceNode); } else { - deleteConditionNotMet.add(dependentResourceNode); + deletePostConditionNotMet.add(dependentResourceNode); + alreadyVisited.add(dependentResourceNode); } } catch (RuntimeException e) { handleExceptionInExecutor(dependentResourceNode, e);