This is an automated email from the ASF dual-hosted git repository. jianbin pushed a commit to branch 2.x in repository https://gitbox.apache.org/repos/asf/incubator-seata.git
The following commit(s) were added to refs/heads/2.x by this push: new b4ea963df8 bugfix: fix the bug where Role.participant does not execute hooks but clears them. (#6385) b4ea963df8 is described below commit b4ea963df802c7ca8ad2f72ec10f2e2067c78290 Author: jonasHanhan <130035609+jonashan...@users.noreply.github.com> AuthorDate: Tue Mar 5 16:41:25 2024 +0800 bugfix: fix the bug where Role.participant does not execute hooks but clears them. (#6385) --- changes/en-us/2.x.md | 2 ++ changes/zh-cn/2.x.md | 2 ++ .../seata/saga/engine/store/StateLogStore.java | 2 +- .../engine/impl/ProcessCtrlStateMachineEngine.java | 10 ++++++---- .../engine/store/db/DbAndReportTcStateLogStore.java | 21 +++++++++++++++++---- .../engine/tm/DefaultSagaTransactionalTemplate.java | 12 ++++++++++-- .../saga/engine/tm/SagaTransactionalTemplate.java | 2 +- .../engine/mock/MockSagaTransactionTemplate.java | 2 +- .../apache/seata/tm/api/TransactionalTemplate.java | 14 +++++++++++--- 9 files changed, 51 insertions(+), 16 deletions(-) diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md index 6d9a0631d2..fa5ebb56ef 100644 --- a/changes/en-us/2.x.md +++ b/changes/en-us/2.x.md @@ -31,6 +31,7 @@ Add changes here for all PR submitted to the 2.x branch. - [[#6363](https://github.com/apache/incubator-seata/pull/6363)] fix known problems of docker image - [[#6372](https://github.com/apache/incubator-seata/pull/6372)] fix initializing the sql file postgresql.sql index name conflict - [[#6380](https://github.com/apache/incubator-seata/pull/6380)] fix sql exception when checking for the existence of the UNDO_LOG table on SQL server +- [[#6385](https://github.com/apache/incubator-seata/pull/6385)] fix the bug where Role.participant does not execute hooks but clears them. ### optimize: - [[#6031](https://github.com/apache/incubator-seata/pull/6031)] add a check for the existence of the undolog table @@ -156,5 +157,6 @@ Thanks to these contributors for their code commits. Please report an unintended - [liuqiufeng](https://github.com/liuqiufeng) - [saberyjs](https://github.com/SABERYJS) - [gggyd123](https://github.com/gggyd123) +- [jonasHanhan](https://github.com/jonasHanhan) Also, we receive many valuable issues, questions and advices from our community. Thanks for you all. diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md index 29c9654fac..5c7ff19985 100644 --- a/changes/zh-cn/2.x.md +++ b/changes/zh-cn/2.x.md @@ -31,6 +31,7 @@ - [[#6363](https://github.com/apache/incubator-seata/pull/6363)] 修复docker镜像中的已知问题 - [[#6372](https://github.com/apache/incubator-seata/pull/6372)] 修复初始化sql文件postgresql.sql 索引名称冲突问题 - [[#6380](https://github.com/apache/incubator-seata/pull/6380)] 修复针对sql server检查UNDO_LOG表是否存在时的SQL异常 +- [[#6385](https://github.com/apache/incubator-seata/pull/6385)] 修复Role.Participant不执行hook但会清理的问题 @@ -159,5 +160,6 @@ - [liuqiufeng](https://github.com/liuqiufeng) - [saberyjs](https://github.com/SABERYJS) - [gggyd123](https://github.com/gggyd123) +- [jonasHanhan](https://github.com/jonasHanhan) 同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。 diff --git a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java b/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java index 29c6cac678..1c95f2ac2c 100644 --- a/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java +++ b/saga/seata-saga-engine-store/src/main/java/org/apache/seata/saga/engine/store/StateLogStore.java @@ -113,5 +113,5 @@ public interface StateLogStore { /** * clear the LocalThread */ - void clearUp(); + void clearUp(ProcessContext context); } \ No newline at end of file diff --git a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java index e559d6c770..c055c8dc23 100644 --- a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java +++ b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java @@ -103,6 +103,8 @@ public class ProcessCtrlStateMachineEngine implements StateMachineEngine { private StateMachineInstance startInternal(String stateMachineName, String tenantId, String businessKey, Map<String, Object> startParams, boolean async, AsyncCallback callback) throws EngineExecutionException { + StateMachineInstance instance = null; + ProcessContext processContext = null; try { if (async && !stateMachineConfig.isEnableAsync()) { throw new EngineExecutionException( @@ -114,7 +116,7 @@ public class ProcessCtrlStateMachineEngine implements StateMachineEngine { tenantId = stateMachineConfig.getDefaultTenantId(); } - StateMachineInstance instance = createMachineInstance(stateMachineName, tenantId, businessKey, startParams); + instance = createMachineInstance(stateMachineName, tenantId, businessKey, startParams); ProcessContextBuilder contextBuilder = ProcessContextBuilder.create().withProcessType(ProcessType.STATE_LANG) .withOperationName(DomainConstants.OPERATION_NAME_START).withAsyncCallback(callback).withInstruction( @@ -134,7 +136,7 @@ public class ProcessCtrlStateMachineEngine implements StateMachineEngine { contextBuilder.withIsAsyncExecution(async); - ProcessContext processContext = contextBuilder.build(); + processContext = contextBuilder.build(); if (instance.getStateMachine().isPersist() && stateMachineConfig.getStateLogStore() != null) { stateMachineConfig.getStateLogStore().recordStateMachineStarted(instance, processContext); @@ -158,8 +160,8 @@ public class ProcessCtrlStateMachineEngine implements StateMachineEngine { return instance; } finally { - if (stateMachineConfig.getStateLogStore() != null) { - stateMachineConfig.getStateLogStore().clearUp(); + if (stateMachineConfig.getStateLogStore() != null && instance != null && processContext != null) { + stateMachineConfig.getStateLogStore().clearUp(processContext); } } } diff --git a/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java index 8cc8b4bf5c..d70515ca28 100644 --- a/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java +++ b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/store/db/DbAndReportTcStateLogStore.java @@ -117,7 +117,7 @@ public class DbAndReportTcStateLogStore extends AbstractStore implements StateLo } catch (StoreException e) { LOGGER.error("Record statemachine start error: {}, StateMachine: {}, XID: {}, Reason: {}", e.getErrcode(), machineInstance.getStateMachine().getName(), machineInstance.getId(), e.getMessage(), e); - this.clearUp(); + this.clearUp(context); throw e; } } @@ -236,7 +236,7 @@ public class DbAndReportTcStateLogStore extends AbstractStore implements StateLo RootContext.unbind(); RootContext.unbindBranchType(); sagaTransactionalTemplate.triggerAfterCompletion(globalTransaction); - sagaTransactionalTemplate.cleanUp(); + sagaTransactionalTemplate.cleanUp(globalTransaction); } } } @@ -729,11 +729,24 @@ public class DbAndReportTcStateLogStore extends AbstractStore implements StateLo } @Override - public void clearUp() { + public void clearUp(ProcessContext context) { RootContext.unbind(); RootContext.unbindBranchType(); if (sagaTransactionalTemplate != null) { - sagaTransactionalTemplate.cleanUp(); + GlobalTransaction globalTransaction; + StateMachineInstance machineInstance = (StateMachineInstance) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_INST); + if (machineInstance != null) { + try { + globalTransaction = getGlobalTransaction(machineInstance, context); + sagaTransactionalTemplate.cleanUp(globalTransaction); + } catch (ExecutionException e) { + LOGGER.error("Report transaction finish to server error: {}, StateMachine: {}, XID: {}, Reason: {}", + e.getCode(), machineInstance.getStateMachine().getName(), machineInstance.getId(), e.getMessage(), e); + } catch (TransactionException e) { + LOGGER.error("Report transaction finish to server error: {}, StateMachine: {}, XID: {}, Reason: {}", + e.getCode(), machineInstance.getStateMachine().getName(), machineInstance.getId(), e.getMessage(), e); + } + } } } diff --git a/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/DefaultSagaTransactionalTemplate.java b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/DefaultSagaTransactionalTemplate.java index 9e1ff71a6e..3c067565d8 100644 --- a/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/DefaultSagaTransactionalTemplate.java +++ b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/DefaultSagaTransactionalTemplate.java @@ -18,6 +18,7 @@ package org.apache.seata.saga.engine.tm; import java.util.List; +import org.apache.seata.common.exception.FrameworkErrorCode; import org.apache.seata.core.exception.TransactionException; import org.apache.seata.core.model.BranchStatus; import org.apache.seata.core.model.BranchType; @@ -27,6 +28,7 @@ import org.apache.seata.core.rpc.ShutdownHook; import org.apache.seata.core.rpc.netty.TmNettyRemotingClient; import org.apache.seata.rm.DefaultResourceManager; import org.apache.seata.rm.RMClient; +import org.apache.seata.saga.engine.exception.EngineExecutionException; import org.apache.seata.saga.rm.SagaResource; import org.apache.seata.tm.TMClient; import org.apache.seata.tm.api.GlobalTransaction; @@ -273,8 +275,14 @@ public class DefaultSagaTransactionalTemplate } @Override - public void cleanUp() { - TransactionHookManager.clear(); + public void cleanUp(GlobalTransaction tx) { + if (tx == null) { + throw new EngineExecutionException("Global transaction does not exist. Unable to proceed without a valid global transaction context.", + FrameworkErrorCode.ObjectNotExists); + } + if (tx.getGlobalTransactionRole() == GlobalTransactionRole.Launcher) { + TransactionHookManager.clear(); + } } protected List<TransactionHook> getCurrentHooks() { diff --git a/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/SagaTransactionalTemplate.java b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/SagaTransactionalTemplate.java index e1db2ef814..d0be486d59 100644 --- a/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/SagaTransactionalTemplate.java +++ b/saga/seata-saga-spring/src/main/java/org/apache/seata/saga/engine/tm/SagaTransactionalTemplate.java @@ -50,5 +50,5 @@ public interface SagaTransactionalTemplate { void triggerAfterCompletion(GlobalTransaction tx); - void cleanUp(); + void cleanUp(GlobalTransaction tx); } \ No newline at end of file diff --git a/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java b/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java index 55da9629da..4a92fe39c5 100644 --- a/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java +++ b/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java @@ -76,7 +76,7 @@ public class MockSagaTransactionTemplate implements SagaTransactionalTemplate { } @Override - public void cleanUp() { + public void cleanUp(GlobalTransaction tx) { } } diff --git a/tm/src/main/java/org/apache/seata/tm/api/TransactionalTemplate.java b/tm/src/main/java/org/apache/seata/tm/api/TransactionalTemplate.java index a7d9b69f13..5b25963e7b 100644 --- a/tm/src/main/java/org/apache/seata/tm/api/TransactionalTemplate.java +++ b/tm/src/main/java/org/apache/seata/tm/api/TransactionalTemplate.java @@ -18,6 +18,8 @@ package org.apache.seata.tm.api; import java.util.List; +import org.apache.seata.common.exception.FrameworkErrorCode; +import org.apache.seata.common.exception.FrameworkException; import org.apache.seata.common.exception.ShouldNeverHappenException; import org.apache.seata.core.context.GlobalLockConfigHolder; import org.apache.seata.core.exception.TmTransactionException; @@ -140,7 +142,7 @@ public class TransactionalTemplate { //5. clear resumeGlobalLockConfig(previousConfig); triggerAfterCompletion(tx); - cleanUp(); + cleanUp(tx); } } finally { // If the transaction is suspended, resume it. @@ -385,8 +387,14 @@ public class TransactionalTemplate { } } - private void cleanUp() { - TransactionHookManager.clear(); + private void cleanUp(GlobalTransaction tx) { + if (tx == null) { + throw new FrameworkException("Global transaction does not exist. Unable to proceed without a valid global transaction context.", + FrameworkErrorCode.ObjectNotExists); + } + if (tx.getGlobalTransactionRole() == GlobalTransactionRole.Launcher) { + TransactionHookManager.clear(); + } } private List<TransactionHook> getCurrentHooks() { --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org For additional commands, e-mail: notifications-h...@seata.apache.org