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);
}
}