protected void branchReport()

in saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java [478:579]


    protected void branchReport(StateInstance stateInstance, ProcessContext context) {
        if (sagaTransactionalTemplate != null) {
            StateMachineConfig stateMachineConfig = (StateMachineConfig) context.getVariable(
                    DomainConstants.VAR_NAME_STATEMACHINE_CONFIG);

            if (stateMachineConfig instanceof DbStateMachineConfig
                    && !((DbStateMachineConfig)stateMachineConfig).isSagaBranchRegisterEnable()) {
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("sagaBranchRegisterEnable = false, skip branch report. state[" + stateInstance.getName() + "]");
                }
                return;
            }

            BranchStatus branchStatus = null;
            //find out the original state instance, only the original state instance is registered on the server, and its status should
            // be reported.
            StateInstance originalStateInst = null;
            if (StringUtils.hasLength(stateInstance.getStateIdRetriedFor())) {

                if (isUpdateMode(stateInstance, context)) {
                    originalStateInst = stateInstance;
                } else {
                    originalStateInst = findOutOriginalStateInstanceOfRetryState(stateInstance);
                }

                if (ExecutionStatus.SU.equals(stateInstance.getStatus())) {
                    branchStatus = BranchStatus.PhaseTwo_Committed;
                } else if (ExecutionStatus.FA.equals(stateInstance.getStatus()) || ExecutionStatus.UN.equals(
                        stateInstance.getStatus())) {
                    branchStatus = BranchStatus.PhaseOne_Failed;
                } else {
                    branchStatus = BranchStatus.Unknown;
                }

            } else if (StringUtils.hasLength(stateInstance.getStateIdCompensatedFor())) {

                if (isUpdateMode(stateInstance, context)) {
                    originalStateInst = stateInstance.getStateMachineInstance().getStateMap().get(
                        stateInstance.getStateIdCompensatedFor());
                } else {
                    originalStateInst = findOutOriginalStateInstanceOfCompensateState(stateInstance);
                }
            }

            if (originalStateInst == null) {
                originalStateInst = stateInstance;
            }

            if (branchStatus == null) {
                if (ExecutionStatus.SU.equals(originalStateInst.getStatus()) && originalStateInst.getCompensationStatus() == null) {
                    branchStatus = BranchStatus.PhaseTwo_Committed;
                } else if (ExecutionStatus.SU.equals(originalStateInst.getCompensationStatus())) {
                    branchStatus = BranchStatus.PhaseTwo_Rollbacked;
                } else if (ExecutionStatus.FA.equals(originalStateInst.getCompensationStatus())
                        || ExecutionStatus.UN.equals(originalStateInst.getCompensationStatus())) {
                    branchStatus = BranchStatus.PhaseTwo_RollbackFailed_Retryable;
                } else if ((ExecutionStatus.FA.equals(originalStateInst.getStatus()) || ExecutionStatus.UN.equals(
                        originalStateInst.getStatus()))
                        && originalStateInst.getCompensationStatus() == null) {
                    branchStatus = BranchStatus.PhaseOne_Failed;
                } else {
                    branchStatus = BranchStatus.Unknown;
                }
            }

            try {
                StateMachineInstance machineInstance = stateInstance.getStateMachineInstance();
                GlobalTransaction globalTransaction = getGlobalTransaction(machineInstance, context);

                if (globalTransaction == null) {
                    throw new EngineExecutionException("Global transaction is not exists", FrameworkErrorCode.ObjectNotExists);
                }

                sagaTransactionalTemplate.branchReport(globalTransaction.getXid(), Long.parseLong(originalStateInst.getId()), branchStatus,
                        null);
            } catch (TransactionException e) {
                LOGGER.error(
                        "Report branch status to server error: {}, StateMachine:{}, StateName:{}, XID: {}, branchId: {}, branchStatus:{},"
                                + " Reason:{} "
                        , e.getCode()
                        , originalStateInst.getStateMachineInstance().getStateMachine().getName()
                        , originalStateInst.getName()
                        , originalStateInst.getStateMachineInstance().getId()
                        , originalStateInst.getId()
                        , branchStatus
                        , e.getMessage()
                        , e);
            } catch (ExecutionException e) {
                LOGGER.error(
                        "Report branch status to server error: {}, StateMachine:{}, StateName:{}, XID: {}, branchId: {}, branchStatus:{},"
                                + " Reason:{} "
                        , e.getCode()
                        , originalStateInst.getStateMachineInstance().getStateMachine().getName()
                        , originalStateInst.getName()
                        , originalStateInst.getStateMachineInstance().getId()
                        , originalStateInst.getId()
                        , branchStatus
                        , e.getMessage()
                        , e);
            }
        }
    }