incubator-seata icon indicating copy to clipboard operation
incubator-seata copied to clipboard

Saga branch rollback retry in tm will cause null NullPointerException because StateMachineEngineHolder can not get getStateMachineEngine

Open xjlgod opened this issue 11 months ago • 1 comments

  • [x] I have searched the issues of this repository and believe that this is not a duplicate.

Ⅰ. Issue Description

I use spring-seata-saga in seata-sample repo, when saga transaction begin to retry, tm receive branchRollback request. StateMachineEngineHolder.getStateMachineEngine() will return null

Image

Ⅱ. Describe what happened

If there is an exception, please attach the exception trace:

2025-01-13 21:57:11.729 [rpcDispatch_RMROLE_1_3_40] ERROR io.seata.saga.rm.SagaResourceManager - StateMachine forward failed, xid: 169.254.134.222:8091:72665187015102548
java.lang.NullPointerException: null
	at io.seata.saga.rm.SagaResourceManager.branchCommit(SagaResourceManager.java:89)
	at org.apache.seata.rm.AbstractRMHandler.doBranchCommit(AbstractRMHandler.java:98)
	at org.apache.seata.rm.AbstractRMHandler$1.execute(AbstractRMHandler.java:54)
	at org.apache.seata.rm.AbstractRMHandler$1.execute(AbstractRMHandler.java:50)
	at org.apache.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:127)
	at org.apache.seata.rm.AbstractRMHandler.handle(AbstractRMHandler.java:50)
	at org.apache.seata.rm.DefaultRMHandler.handle(DefaultRMHandler.java:61)
	at org.apache.seata.core.protocol.transaction.BranchCommitRequest.handle(BranchCommitRequest.java:35)
	at org.apache.seata.rm.AbstractRMHandler.onRequest(AbstractRMHandler.java:150)
	at org.apache.seata.core.rpc.processor.client.RmBranchCommitProcessor.handleBranchCommit(RmBranchCommitProcessor.java:63)
	at org.apache.seata.core.rpc.processor.client.RmBranchCommitProcessor.process(RmBranchCommitProcessor.java:58)
	at org.apache.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:280)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:834)

Ⅲ. Describe what you expected to happen

tm retry success

Ⅳ. How to reproduce it (as minimally and precisely as possible)

  1. make spring-seata-saga retry fail (compensate fail)

Ⅴ. Anything else we need to know?

Ⅵ. Environment:

  • JDK 11
  • Seata client/server version: 2.4 (use 2.x branch)

xjlgod avatar Jan 13 '25 14:01 xjlgod

Image

history saga-spring decoupling cause not incompatible.because spring needs to be decoupled, spring-based injection is not desirable. should use StateMachineEngineHolder.setStateMachineEngine(stateMachineEngine); instead it .

Image

wt-better avatar Jan 14 '25 03:01 wt-better

the same question

java.lang.NullPointerException: Cannot invoke "io.seata.saga.engine.StateMachineEngine.reloadStateMachineInstance(String)" because the return value of "io.seata.saga.rm.StateMachineEngineHolder.getStateMachineEngine()" is null
	at io.seata.saga.rm.SagaResourceManager.branchRollback(SagaResourceManager.java:135) ~[seata-all-2.5.0.jar:2.5.0]
	at org.apache.seata.rm.AbstractRMHandler.doBranchRollback(AbstractRMHandler.java:131) ~[seata-all-2.5.0.jar:2.5.0]
	at org.apache.seata.rm.AbstractRMHandler$2.execute(AbstractRMHandler.java:71) ~[seata-all-2.5.0.jar:2.5.0]

beacause the org.apache.seata.rm.AbstractRMHandler.doBranchRollback called io.seata.saga.rm.SagaResourceManager.branchRollback the package is different

some pics when debug: Image

Image Image Image

the class in org.apache.seata is covered by the class in io.seata.saga

whaon avatar Sep 05 '25 07:09 whaon