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

Reply via email to