public static void setMachineStatusBasedOnStateListAndException()

in saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/strategy/impl/DefaultStatusDecisionStrategy.java [97:139]


    public static void setMachineStatusBasedOnStateListAndException(StateMachineInstance stateMachineInstance,
                                                                    List<StateInstance> stateList, Exception exp) {
        boolean hasSetStatus = false;
        boolean hasSuccessUpdateService = false;
        if (CollectionUtils.isNotEmpty(stateList)) {
            boolean hasUnsuccessService = false;

            for (int i = stateList.size() - 1; i >= 0; i--) {
                StateInstance stateInstance = stateList.get(i);

                if (stateInstance.isIgnoreStatus() || stateInstance.isForCompensation()) {
                    continue;
                }
                if (ExecutionStatus.UN.equals(stateInstance.getStatus())) {
                    stateMachineInstance.setStatus(ExecutionStatus.UN);
                    hasSetStatus = true;
                } else if (ExecutionStatus.SU.equals(stateInstance.getStatus())) {
                    if (StateType.SERVICE_TASK.equals(stateInstance.getType())) {
                        if (stateInstance.isForUpdate() && !stateInstance.isForCompensation()) {
                            hasSuccessUpdateService = true;
                        }
                    }
                } else if (ExecutionStatus.SK.equals(stateInstance.getStatus())) {
                    // ignore
                } else {
                    hasUnsuccessService = true;
                }
            }

            if (!hasSetStatus && hasUnsuccessService) {
                if (hasSuccessUpdateService) {
                    stateMachineInstance.setStatus(ExecutionStatus.UN);
                } else {
                    stateMachineInstance.setStatus(ExecutionStatus.FA);
                }
                hasSetStatus = true;
            }
        }

        if (!hasSetStatus) {
            setMachineStatusBasedOnException(stateMachineInstance, exp, hasSuccessUpdateService);
        }
    }