@@ -22,7 +22,7 @@ public class WorkflowReconcileExecutor<P extends HasMetadata> {
22
22
23
23
private final Set <DependentResourceNode <?, ?>> alreadyReconciled = ConcurrentHashMap .newKeySet ();
24
24
private final Set <DependentResourceNode <?, ?>> errored = ConcurrentHashMap .newKeySet ();
25
- private final Set <DependentResourceNode <?, ?>> reconciledButNotReady =
25
+ private final Set <DependentResourceNode <?, ?>> notReady =
26
26
ConcurrentHashMap .newKeySet ();
27
27
private final Set <DependentResourceNode <?, ?>> reconcileConditionOrParentsConditionNotMet =
28
28
ConcurrentHashMap .newKeySet ();
@@ -73,8 +73,8 @@ private synchronized void handleReconcile(
73
73
74
74
if (alreadyReconciled (dependentResourceNode )
75
75
|| isReconcilingNow (dependentResourceNode )
76
- || !allDependsReconciledAndReady (dependentResourceNode )
77
- || hasErroredDependOn (dependentResourceNode )) {
76
+ || !allParentsReconciledAndReady (dependentResourceNode )
77
+ || hasErroredParent (dependentResourceNode )) {
78
78
log .debug ("Skipping submit of: {}, " , dependentResourceNode );
79
79
return ;
80
80
}
@@ -103,16 +103,26 @@ private synchronized void handleExceptionInExecutor(DependentResourceNode depend
103
103
}
104
104
105
105
private synchronized void handleNodeExecutionFinish (DependentResourceNode dependentResourceNode ) {
106
+ log .debug ("Finished execution for: {}" , dependentResourceNode );
106
107
actualExecutions .remove (dependentResourceNode );
107
108
if (actualExecutions .isEmpty ()) {
108
109
this .notifyAll ();
109
110
}
110
111
}
111
112
113
+ // needs to be synced
112
114
private synchronized void updateStatusForNotReady (ReadyCondition <?, P > readyCondition ) {
113
115
readyCondition .addNotReadyStatusInfo (primary );
114
116
}
115
117
118
+ // needs to be in one step
119
+ private synchronized void setAlreadyReconciledButNotReady (
120
+ DependentResourceNode <?, P > dependentResourceNode ) {
121
+ log .debug ("Setting already reconciled but not ready for: {}" , dependentResourceNode );
122
+ alreadyReconciled .add (dependentResourceNode );
123
+ notReady .add (dependentResourceNode );
124
+ }
125
+
116
126
private boolean ownOrParentsReconcileConditionNotMet (
117
127
DependentResourceNode <?, ?> dependentResourceNode ) {
118
128
return reconcileConditionOrParentsConditionNotMet .contains (dependentResourceNode ) ||
@@ -136,7 +146,7 @@ private NodeExecutor(DependentResourceNode<?, P> dependentResourceNode,
136
146
public void run () {
137
147
try {
138
148
DependentResource dependentResource = dependentResourceNode .getDependentResource ();
139
- boolean handleDependents = true ;
149
+ boolean ready = true ;
140
150
if (onlyReconcileForPossibleDelete ) {
141
151
if (dependentResource instanceof Deleter ) {
142
152
((Deleter <P >) dependentResource ).delete (primary , context );
@@ -146,15 +156,17 @@ public void run() {
146
156
if (dependentResourceNode .getReadyCondition ().isPresent ()
147
157
&& !dependentResourceNode .getReadyCondition ().get ()
148
158
.isMet (dependentResource , primary , context )) {
149
- handleDependents = false ;
150
- reconciledButNotReady .add (dependentResourceNode );
151
- // needs to be synced
159
+ ready = false ;
152
160
updateStatusForNotReady (dependentResourceNode .getReadyCondition ().get ());
153
161
}
154
162
}
155
- alreadyReconciled .add (dependentResourceNode );
156
- if (handleDependents ) {
163
+
164
+ if (ready ) {
165
+ log .debug ("Setting already reconciled for: {}" , dependentResourceNode );
166
+ alreadyReconciled .add (dependentResourceNode );
157
167
handleDependentsReconcile (dependentResourceNode , onlyReconcileForPossibleDelete );
168
+ } else {
169
+ setAlreadyReconciledButNotReady (dependentResourceNode );
158
170
}
159
171
} catch (RuntimeException e ) {
160
172
handleExceptionInExecutor (dependentResourceNode , e );
@@ -172,7 +184,11 @@ private synchronized void handleDependentsReconcile(
172
184
DependentResourceNode <?, P > dependentResourceNode , boolean onlyReconcileForPossibleDelete ) {
173
185
var dependents = workflow .getDependents ().get (dependentResourceNode );
174
186
if (dependents != null ) {
175
- dependents .forEach (d -> handleReconcile (d , onlyReconcileForPossibleDelete ));
187
+
188
+ dependents .forEach (d -> {
189
+ log .debug ("Handle reconcile for dependent: {} of parent:{}" , d , dependentResourceNode );
190
+ handleReconcile (d , onlyReconcileForPossibleDelete );
191
+ });
176
192
}
177
193
}
178
194
@@ -199,15 +215,14 @@ private void handleReconcileCondition(DependentResourceNode<?, ?> dependentResou
199
215
}
200
216
}
201
217
202
- private boolean allDependsReconciledAndReady (
218
+ private boolean allParentsReconciledAndReady (
203
219
DependentResourceNode <?, ?> dependentResourceNode ) {
204
220
return dependentResourceNode .getDependsOn ().isEmpty ()
205
221
|| dependentResourceNode .getDependsOn ().stream ()
206
- .allMatch (d -> alreadyReconciled (d )
207
- && !reconciledButNotReady .contains (dependentResourceNode ));
222
+ .allMatch (d -> alreadyReconciled (d ) && !notReady .contains (d ));
208
223
}
209
224
210
- private boolean hasErroredDependOn (
225
+ private boolean hasErroredParent (
211
226
DependentResourceNode <?, ?> dependentResourceNode ) {
212
227
return !dependentResourceNode .getDependsOn ().isEmpty ()
213
228
&& dependentResourceNode .getDependsOn ().stream ()
0 commit comments