1111import java .util .Objects ;
1212import java .util .Optional ;
1313import java .util .Set ;
14+ import java .util .function .Consumer ;
1415import java .util .function .Function ;
1516import java .util .stream .Collectors ;
1617import java .util .stream .Stream ;
@@ -221,33 +222,42 @@ static class StatusUpdateStep extends Step {
221222 public NextAction apply (Packet packet ) {
222223 LOGGER .entering ();
223224
224- StatusUpdateContext context = new StatusUpdateContext (packet );
225- DomainStatus status = context .getStatus ().clearModified ();
226-
227- if (context .getDomain () != null ) {
228- status .setServers (new ArrayList <>(context .getServerStatuses ().values ()));
229- status .setReplicas (context .getReplicaSetting ());
230-
231- if (context .isHasFailedPod ()) {
232- status .removeConditionIf (c -> c .getType () == Available );
233- status .removeConditionIf (c -> c .getType () == Progressing );
234- status .addCondition (new DomainCondition (Failed ).withStatus (TRUE ).withReason ("PodFailed" ));
235- } else {
236- status .removeConditionIf (c -> c .getType () == Failed );
237- if (context .allIntendedServersRunning ()) {
238- status .removeConditionIf (c -> c .getType () == Progressing );
239- status .addCondition (
240- new DomainCondition (Available ).withStatus (TRUE ).withReason (SERVERS_READY_REASON ));
241- }
242- }
243- }
225+ final StatusUpdateContext context = new StatusUpdateContext (packet );
226+
227+ DomainStatus status = context .getStatus ();
228+
229+ boolean isStatusModified =
230+ modifyDomainStatus (
231+ status ,
232+ s -> {
233+ if (context .getDomain () != null ) {
234+ s .setServers (new ArrayList <>(context .getServerStatuses ().values ()));
235+ s .setReplicas (context .getReplicaSetting ());
236+
237+ if (context .isHasFailedPod ()) {
238+ s .removeConditionIf (c -> c .getType () == Available );
239+ s .removeConditionIf (c -> c .getType () == Progressing );
240+ s .addCondition (
241+ new DomainCondition (Failed ).withStatus (TRUE ).withReason ("PodFailed" ));
242+ } else {
243+ s .removeConditionIf (c -> c .getType () == Failed );
244+ if (context .allIntendedServersRunning ()) {
245+ s .removeConditionIf (c -> c .getType () == Progressing );
246+ s .addCondition (
247+ new DomainCondition (Available )
248+ .withStatus (TRUE )
249+ .withReason (SERVERS_READY_REASON ));
250+ }
251+ }
252+ }
253+ });
244254
245- if (status . isModified () ) {
255+ if (isStatusModified ) {
246256 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getInfo ().getDomainUid (), status );
247257 }
248258 LOGGER .exiting ();
249259
250- return status . isModified ()
260+ return isStatusModified
251261 ? doDomainUpdate (
252262 context .getDomain (), context .getInfo (), packet , StatusUpdateStep .this , getNext ())
253263 : doNext (packet );
@@ -367,18 +377,24 @@ public NextAction apply(Packet packet) {
367377 LOGGER .entering ();
368378
369379 DomainConditionStepContext context = new DomainConditionStepContext (packet );
370- DomainStatus status = context .getStatus ().clearModified ();
371-
372- status .addCondition (new DomainCondition (Progressing ).withStatus (TRUE ).withReason (reason ));
373- status .removeConditionIf (c -> c .getType () == Failed );
374- if (!isPreserveAvailable ) {
375- status .removeConditionIf (c -> c .getType () == Available );
376- }
380+ DomainStatus status = context .getStatus ();
381+
382+ boolean isStatusModified =
383+ modifyDomainStatus (
384+ status ,
385+ s -> {
386+ s .addCondition (
387+ new DomainCondition (Progressing ).withStatus (TRUE ).withReason (reason ));
388+ s .removeConditionIf (c -> c .getType () == Failed );
389+ if (!isPreserveAvailable ) {
390+ s .removeConditionIf (c -> c .getType () == Available );
391+ }
392+ });
377393
378394 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getDomain ().getDomainUid (), status );
379395 LOGGER .exiting ();
380396
381- return status . isModified ()
397+ return isStatusModified
382398 ? doDomainUpdate (
383399 context .getDomain (), context .getInfo (), packet , ProgressingStep .this , getNext ())
384400 : doNext (packet );
@@ -396,14 +412,19 @@ public NextAction apply(Packet packet) {
396412 LOGGER .entering ();
397413
398414 DomainConditionStepContext context = new DomainConditionStepContext (packet );
399- DomainStatus status = context .getStatus (). clearModified () ;
415+ DomainStatus status = context .getStatus ();
400416
401- status .removeConditionIf (c -> c .getType () == Progressing && TRUE .equals (c .getStatus ()));
417+ boolean isStatusModified =
418+ modifyDomainStatus (
419+ status ,
420+ s ->
421+ s .removeConditionIf (
422+ c -> c .getType () == Progressing && TRUE .equals (c .getStatus ())));
402423
403424 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getDomain ().getDomainUid (), status );
404425 LOGGER .exiting ();
405426
406- return status . isModified ()
427+ return isStatusModified
407428 ? doDomainUpdate (
408429 context .getDomain (), context .getInfo (), packet , EndProgressingStep .this , getNext ())
409430 : doNext (packet );
@@ -423,20 +444,33 @@ public NextAction apply(Packet packet) {
423444 LOGGER .entering ();
424445
425446 DomainConditionStepContext context = new DomainConditionStepContext (packet );
426- DomainStatus status = context .getStatus (). clearModified () ;
447+ DomainStatus status = context .getStatus ();
427448
428- status .addCondition (new DomainCondition (Available ).withStatus (TRUE ).withReason (reason ));
429- status .removeConditionIf (c -> c .getType () == Failed );
449+ boolean isStatusModified =
450+ modifyDomainStatus (
451+ status ,
452+ s -> {
453+ s .addCondition (new DomainCondition (Available ).withStatus (TRUE ).withReason (reason ));
454+ s .removeConditionIf (c -> c .getType () == Failed );
455+ });
430456
431457 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getDomain ().getDomainUid (), status );
432458 LOGGER .exiting ();
433- return status . isModified ()
459+ return isStatusModified
434460 ? doDomainUpdate (
435461 context .getDomain (), context .getInfo (), packet , AvailableStep .this , getNext ())
436462 : doNext (packet );
437463 }
438464 }
439465
466+ private static boolean modifyDomainStatus (DomainStatus domainStatus , Consumer <DomainStatus > statusUpdateConsumer ) {
467+ synchronized (domainStatus ) {
468+ domainStatus .clearModified ();
469+ statusUpdateConsumer .accept (domainStatus );
470+ return domainStatus .isModified ();
471+ }
472+ }
473+
440474 private static class FailedStep extends Step {
441475 private final Throwable throwable ;
442476
@@ -450,21 +484,26 @@ public NextAction apply(Packet packet) {
450484 LOGGER .entering ();
451485
452486 DomainConditionStepContext context = new DomainConditionStepContext (packet );
453- final DomainStatus status = context .getStatus ().clearModified ();
454-
455- status .addCondition (
456- new DomainCondition (Failed )
457- .withStatus (TRUE )
458- .withReason ("Exception" )
459- .withMessage (throwable .getMessage ()));
460- if (status .hasConditionWith (c -> c .hasType (Progressing ))) {
461- status .addCondition (new DomainCondition (Progressing ).withStatus (FALSE ));
462- }
487+ final DomainStatus status = context .getStatus ();
488+
489+ boolean isStatusModified =
490+ modifyDomainStatus (
491+ status ,
492+ s -> {
493+ s .addCondition (
494+ new DomainCondition (Failed )
495+ .withStatus (TRUE )
496+ .withReason ("Exception" )
497+ .withMessage (throwable .getMessage ()));
498+ if (s .hasConditionWith (c -> c .hasType (Progressing ))) {
499+ s .addCondition (new DomainCondition (Progressing ).withStatus (FALSE ));
500+ }
501+ });
463502
464503 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getDomain ().getDomainUid (), status );
465504 LOGGER .exiting ();
466505
467- return status . isModified ()
506+ return isStatusModified
468507 ? doDomainUpdate (
469508 context .getDomain (), context .getInfo (), packet , FailedStep .this , getNext ())
470509 : doNext (packet );
0 commit comments