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 ;
@@ -226,37 +227,45 @@ static class StatusUpdateStep extends Step {
226227 public NextAction apply (Packet packet ) {
227228 LOGGER .entering ();
228229
229- StatusUpdateContext context = new StatusUpdateContext (packet );
230+ final StatusUpdateContext context = new StatusUpdateContext (packet );
231+
230232 DomainStatus status = context .getStatus ();
231- DomainStatus currentStatus = new DomainStatus (status );
232233
233- if (context .getDomain () != null ) {
234- if (context .getDomainConfig ().isPresent ()) {
235- status .setServers (new ArrayList <>(context .getServerStatuses ().values ()));
236- status .setClusters (new ArrayList <>(context .getClusterStatuses ().values ()));
237- status .setReplicas (context .getReplicaSetting ());
238- }
234+ boolean isStatusModified =
235+ modifyDomainStatus (
236+ status ,
237+ s -> {
238+ if (context .getDomain () != null ) {
239+ if (context .getDomainConfig ().isPresent ()) {
240+ s .setServers (new ArrayList <>(context .getServerStatuses ().values ()));
241+ s .setClusters (new ArrayList <>(context .getClusterStatuses ().values ()));
242+ s .setReplicas (context .getReplicaSetting ());
243+ }
239244
240- if (context .isHasFailedPod ()) {
241- status .removeConditionIf (c -> c .getType () == Available );
242- status .removeConditionIf (c -> c .getType () == Progressing );
243- status .addCondition (new DomainCondition (Failed ).withStatus (TRUE ).withReason ("PodFailed" ));
244- } else {
245- status .removeConditionIf (c -> c .getType () == Failed );
246- if (context .allIntendedServersRunning ()) {
247- status .removeConditionIf (c -> c .getType () == Progressing );
248- status .addCondition (
249- new DomainCondition (Available ).withStatus (TRUE ).withReason (SERVERS_READY_REASON ));
250- }
251- }
252- }
245+ if (context .isHasFailedPod ()) {
246+ s .removeConditionIf (c -> c .getType () == Available );
247+ s .removeConditionIf (c -> c .getType () == Progressing );
248+ s .addCondition (
249+ new DomainCondition (Failed ).withStatus (TRUE ).withReason ("PodFailed" ));
250+ } else {
251+ s .removeConditionIf (c -> c .getType () == Failed );
252+ if (context .allIntendedServersRunning ()) {
253+ s .removeConditionIf (c -> c .getType () == Progressing );
254+ s .addCondition (
255+ new DomainCondition (Available )
256+ .withStatus (TRUE )
257+ .withReason (SERVERS_READY_REASON ));
258+ }
259+ }
260+ }
261+ });
253262
254- if (! status . equals ( currentStatus ) ) {
263+ if (isStatusModified ) {
255264 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getInfo ().getDomainUid (), status );
256265 }
257266 LOGGER .exiting ();
258267
259- return ! status . equals ( currentStatus )
268+ return isStatusModified
260269 ? doDomainUpdate (
261270 context .getDomain (), context .getInfo (), packet , StatusUpdateStep .this , getNext ())
262271 : doNext (packet );
@@ -434,19 +443,24 @@ public NextAction apply(Packet packet) {
434443 LOGGER .entering ();
435444
436445 DomainConditionStepContext context = new DomainConditionStepContext (packet );
437- final DomainStatus status = context .getStatus ();
438- final DomainStatus currentStatus = new DomainStatus (status );
446+ DomainStatus status = context .getStatus ();
439447
440- status .addCondition (new DomainCondition (Progressing ).withStatus (TRUE ).withReason (reason ));
441- status .removeConditionIf (c -> c .getType () == Failed );
442- if (!isPreserveAvailable ) {
443- status .removeConditionIf (c -> c .getType () == Available );
444- }
448+ boolean isStatusModified =
449+ modifyDomainStatus (
450+ status ,
451+ s -> {
452+ s .addCondition (
453+ new DomainCondition (Progressing ).withStatus (TRUE ).withReason (reason ));
454+ s .removeConditionIf (c -> c .getType () == Failed );
455+ if (!isPreserveAvailable ) {
456+ s .removeConditionIf (c -> c .getType () == Available );
457+ }
458+ });
445459
446460 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getDomain ().getDomainUid (), status );
447461 LOGGER .exiting ();
448462
449- return ! status . equals ( currentStatus )
463+ return isStatusModified
450464 ? doDomainUpdate (
451465 context .getDomain (), context .getInfo (), packet , ProgressingStep .this , getNext ())
452466 : doNext (packet );
@@ -464,15 +478,19 @@ public NextAction apply(Packet packet) {
464478 LOGGER .entering ();
465479
466480 DomainConditionStepContext context = new DomainConditionStepContext (packet );
467- final DomainStatus status = context .getStatus ();
468- final DomainStatus currentStatus = new DomainStatus (status );
481+ DomainStatus status = context .getStatus ();
469482
470- status .removeConditionIf (c -> c .getType () == Progressing && TRUE .equals (c .getStatus ()));
483+ boolean isStatusModified =
484+ modifyDomainStatus (
485+ status ,
486+ s ->
487+ s .removeConditionIf (
488+ c -> c .getType () == Progressing && TRUE .equals (c .getStatus ())));
471489
472490 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getDomain ().getDomainUid (), status );
473491 LOGGER .exiting ();
474492
475- return ! status . equals ( currentStatus )
493+ return isStatusModified
476494 ? doDomainUpdate (
477495 context .getDomain (), context .getInfo (), packet , EndProgressingStep .this , getNext ())
478496 : doNext (packet );
@@ -492,21 +510,34 @@ public NextAction apply(Packet packet) {
492510 LOGGER .entering ();
493511
494512 DomainConditionStepContext context = new DomainConditionStepContext (packet );
495- final DomainStatus status = context .getStatus ();
496- final DomainStatus currentStatus = new DomainStatus (status );
513+ DomainStatus status = context .getStatus ();
497514
498- status .addCondition (new DomainCondition (Available ).withStatus (TRUE ).withReason (reason ));
499- status .removeConditionIf (c -> c .getType () == Failed );
515+ boolean isStatusModified =
516+ modifyDomainStatus (
517+ status ,
518+ s -> {
519+ s .addCondition (new DomainCondition (Available ).withStatus (TRUE ).withReason (reason ));
520+ s .removeConditionIf (c -> c .getType () == Failed );
521+ });
500522
501523 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getDomain ().getDomainUid (), status );
502524 LOGGER .exiting ();
503- return !status .equals (currentStatus )
525+
526+ return isStatusModified
504527 ? doDomainUpdate (
505528 context .getDomain (), context .getInfo (), packet , AvailableStep .this , getNext ())
506529 : doNext (packet );
507530 }
508531 }
509532
533+ private static boolean modifyDomainStatus (DomainStatus domainStatus , Consumer <DomainStatus > statusUpdateConsumer ) {
534+ final DomainStatus currentStatus = new DomainStatus (domainStatus );
535+ synchronized (domainStatus ) {
536+ statusUpdateConsumer .accept (domainStatus );
537+ return !domainStatus .equals (currentStatus );
538+ }
539+ }
540+
510541 private static class FailedStep extends Step {
511542 private final Throwable throwable ;
512543
@@ -521,21 +552,26 @@ public NextAction apply(Packet packet) {
521552
522553 DomainConditionStepContext context = new DomainConditionStepContext (packet );
523554 final DomainStatus status = context .getStatus ();
524- final DomainStatus currentStatus = new DomainStatus (status );
525-
526- status .addCondition (
527- new DomainCondition (Failed )
528- .withStatus (TRUE )
529- .withReason ("Exception" )
530- .withMessage (throwable .getMessage ()));
531- if (status .hasConditionWith (c -> c .hasType (Progressing ))) {
532- status .addCondition (new DomainCondition (Progressing ).withStatus (FALSE ));
533- }
555+
556+ boolean isStatusModified =
557+ modifyDomainStatus (
558+ status ,
559+ s -> {
560+ s .addCondition (
561+ new DomainCondition (Failed )
562+ .withStatus (TRUE )
563+ .withReason ("Exception" )
564+ .withMessage (throwable .getMessage ()));
565+ if (s .hasConditionWith (c -> c .hasType (Progressing ))) {
566+ s .addCondition (new DomainCondition (Progressing ).withStatus (FALSE ));
567+ }
568+ });
569+
534570
535571 LOGGER .info (MessageKeys .DOMAIN_STATUS , context .getDomain ().getDomainUid (), status );
536572 LOGGER .exiting ();
537573
538- return ! status . equals ( currentStatus )
574+ return isStatusModified
539575 ? doDomainUpdate (
540576 context .getDomain (), context .getInfo (), packet , FailedStep .this , getNext ())
541577 : doNext (packet );
0 commit comments