apache / incubator-seata

:fire: Seata is an easy-to-use, high-performance, open source distributed transaction solution.
https://seata.apache.org/
Apache License 2.0
25.21k stars 8.76k forks source link

Seata 2.0.0 TCC事务发起异常 #6083

Closed finovy closed 9 months ago

finovy commented 9 months ago

Ⅰ. Issue Description

使用2.0.0版本发起TCC事务时报了如下错误

Ⅱ. Describe what happened

在BranchRegister addBranch 时报错如下错误:

java.util.ServiceConfigurationError: com.alipay.sofa.jraft.rpc.RaftRpcFactory: could not find any implementation for class
    at com.alipay.sofa.jraft.util.JRaftServiceLoader.fail(JRaftServiceLoader.java:161)
    at com.alipay.sofa.jraft.util.JRaftServiceLoader.first(JRaftServiceLoader.java:113)
    at com.alipay.sofa.jraft.util.RpcFactoryHelper.<clinit>(RpcFactoryHelper.java:28)
    at com.alipay.sofa.jraft.rpc.ProtobufMsgFactory.<clinit>(ProtobufMsgFactory.java:57)
    at com.alipay.sofa.jraft.rpc.impl.AbstractClientService.<clinit>(AbstractClientService.java:63)
    at com.alipay.sofa.jraft.core.CliServiceImpl.init(CliServiceImpl.java:88)
    at com.alipay.sofa.jraft.core.CliServiceImpl.init(CliServiceImpl.java:73)
    at com.alipay.sofa.jraft.RaftServiceFactory.createAndInitCliService(RaftServiceFactory.java:65)
    at io.seata.server.cluster.raft.RaftServerFactory$SingletonHandler.<clinit>(RaftServerFactory.java:233)
    at io.seata.server.cluster.raft.RaftServerFactory.getInstance(RaftServerFactory.java:78)
    at io.seata.server.session.GlobalSession.addBranch(GlobalSession.java:316)
    at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$0(AbstractCore.java:84)
    at io.seata.server.storage.db.session.DataBaseSessionManager.lockAndExecute(DataBaseSessionManager.java:153)
    at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:332)
    at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:77)
    at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:107)
    at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:299)
    at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:131)
    at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:523)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.handleRequestsByMergedWarpMessage(ServerOnRequestProcessor.java:288)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.lambda$onRequestMessage$1(ServerOnRequestProcessor.java:178)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
02:46:29.513 [ServerHandlerThread_1_5_500] ERROR i.s.c.r.p.s.ServerOnRequestProcessor 191- handle request error: java.lang.NoClassDefFoundError: Could not initialize class io.seata.server.cluster.raft.RaftServerFactory$SingletonHandler
java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: Could not initialize class io.seata.server.cluster.raft.RaftServerFactory$SingletonHandler
    at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
    at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2073)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:188)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:122)
    at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:280)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class io.seata.server.cluster.raft.RaftServerFactory$SingletonHandler
    at io.seata.server.cluster.raft.RaftServerFactory.getInstance(RaftServerFactory.java:78)
    at io.seata.server.session.GlobalSession.addBranch(GlobalSession.java:316)
    at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$0(AbstractCore.java:84)
    at io.seata.server.storage.db.session.DataBaseSessionManager.lockAndExecute(DataBaseSessionManager.java:153)
    at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:332)
    at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:77)
    at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:107)
    at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:299)
    at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:131)
    at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:523)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.handleRequestsByMergedWarpMessage(ServerOnRequestProcessor.java:288)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.lambda$onRequestMessage$1(ServerOnRequestProcessor.java:178)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.ExceptionInInitializerError [in thread "ForkJoinPool.commonPool-worker-2"]
    at com.alipay.sofa.jraft.core.CliServiceImpl.init(CliServiceImpl.java:88)
    at com.alipay.sofa.jraft.core.CliServiceImpl.init(CliServiceImpl.java:73)
    at com.alipay.sofa.jraft.RaftServiceFactory.createAndInitCliService(RaftServiceFactory.java:65)
    at io.seata.server.cluster.raft.RaftServerFactory$SingletonHandler.<clinit>(RaftServerFactory.java:233)
    ... 23 common frames omitted
02:46:29.513 [ServerHandlerThread_1_4_500] ERROR i.s.c.r.p.s.ServerOnRequestProcessor 191- handle request error: java.lang.ExceptionInInitializerError
java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError
    at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396)
    at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2073)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:188)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:122)
    at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:280)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.ExceptionInInitializerError: null
    at com.alipay.sofa.jraft.core.CliServiceImpl.init(CliServiceImpl.java:88)
    at com.alipay.sofa.jraft.core.CliServiceImpl.init(CliServiceImpl.java:73)
    at com.alipay.sofa.jraft.RaftServiceFactory.createAndInitCliService(RaftServiceFactory.java:65)
    at io.seata.server.cluster.raft.RaftServerFactory$SingletonHandler.<clinit>(RaftServerFactory.java:233)
    at io.seata.server.cluster.raft.RaftServerFactory.getInstance(RaftServerFactory.java:78)
    at io.seata.server.session.GlobalSession.addBranch(GlobalSession.java:316)
    at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$0(AbstractCore.java:84)
    at io.seata.server.storage.db.session.DataBaseSessionManager.lockAndExecute(DataBaseSessionManager.java:153)
    at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:332)
    at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:77)
    at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:107)
    at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:299)
    at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:131)
    at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:523)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.handleRequestsByMergedWarpMessage(ServerOnRequestProcessor.java:288)
    at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.lambda$onRequestMessage$1(ServerOnRequestProcessor.java:178)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
    at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.lang.IllegalStateException: Parse protocol file failed.
    at com.alipay.sofa.jraft.rpc.ProtobufMsgFactory.load(ProtobufMsgFactory.java:88)
    at com.alipay.sofa.jraft.rpc.impl.AbstractClientService.<clinit>(AbstractClientService.java:63)
    ... 27 common frames omitted

Ⅲ. Describe what you expected to happen

能够正常完成事务注册

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

直接发起tcc事务

Ⅴ. Anything else we need to know?

Ⅵ. Environment:

funky-eyes commented 9 months ago

Alpine Linux Try switching to another OS?

finovy commented 9 months ago

Hello, we switched to Debian and the same issue occurred. I'm not sure what additional configuration is required for raft in seata 2.0.0, even though our store mode uses db.

funky-eyes commented 9 months ago

我确认了这是一个bug,不应该在其他的存储模式中,初始化jraft的类 I confirmed that this is a bug and should not initialize jraft's class in other storage modes

funky-eyes commented 9 months ago

请帮我确认下,是否在非alpine linux中运行正常,因为我们的测试环境都是非alpine linux的,对相关存储模式都有过测试验证。 Please help me to confirm if it works fine in non-alpine linux, because our test environment are non-alpine linux, and we have tested and verified the relevant storage modes

finovy commented 9 months ago

Is there any mistake in your description above? Are you trying to verify the operational status on Alpine Linux?

funky-eyes commented 9 months ago

I would like to ask for your assistance in verifying whether running Seata Server on a non-Alpine Linux environment can solve the issue.

finovy commented 9 months ago

Alright, I've confirmed once again that it doesn't work when running on Debian GNU/Linux 11 (bullseye). We are using TCC mode with the store mode using a database, and we haven't configured any raft-related parameters.

funky-eyes commented 9 months ago

Are you running Seata Server on Debian GNU/Linux 11 (bullseye) or running the client on Debian GNU/Linux 11 (bullseye)?

finovy commented 9 months ago

Seata Server. We temporarily commented out this line, and now there are no error messages.

public void addBranch(BranchSession branchSession) throws TransactionException { SessionHolder.getRootSessionManager().onAddBranch(this, branchSession); for (SessionLifecycleListener lifecycleListener : lifecycleListeners) { lifecycleListener.onAddBranch(this, branchSession); } // if (!RaftServerFactory.getInstance().isRaftMode()) { add(branchSession); // } }

funky-eyes commented 9 months ago

I'm using centos 7.6 and don't have this exception you mentioned