Administrator-Xorex opened a new issue, #25543: URL: https://github.com/apache/shardingsphere/issues/25543
## Bug Report Before report a bug, make sure you have: - I have searched open and closed GitHub issues about "Could not commit transaction, The node identifier cannot be null" and so on. - I have Read documentation. ### Vesrion Using ShardingSphere Proxy 5.3.2, Testing distributed transaction about XA Narayana. DataBase: PostgreSQL 14.1-1.pgdg110+1 Docker:20.10.7 ### How I use Add jar at ext-lib: ```shell curl -O https://repo1.maven.org/maven2/org/jboss/narayana/arjunacore/arjuna/5.12.4.Final/arjuna-5.12.4.Final.jar curl -O https://repo1.maven.org/maven2/org/jboss/narayana/common/5.12.4.Final/common-5.12.4.Final.jar curl -O https://repo1.maven.org/maven2/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar curl -O https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar curl -O https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar curl -O https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar curl -O https://repo1.maven.org/maven2/org/jboss/spec/javax/resource/jboss-connector-api_1.7_spec/1.0.0.Final/jboss-connector-api_1.7_spec-1.0.0.Final.jar curl -O https://repo1.maven.org/maven2/org/jboss/logging/jboss-logging/3.2.1.Final/jboss-logging-3.2.1.Final.jar curl -O https://repo1.maven.org/maven2/org/jboss/spec/javax/transaction/jboss-transaction-api_1.2_spec/1.0.0.Alpha3/jboss-transaction-api_1.2_spec-1.0.0.Alpha3.jar curl -O https://repo1.maven.org/maven2/org/jboss/jboss-transaction-spi/7.6.0.Final/jboss-transaction-spi-7.6.0.Final.jar curl -O https://repo1.maven.org/maven2/org/jboss/narayana/jta/jta/5.12.4.Final/jta-5.12.4.Final.jar curl -O https://repo1.maven.org/maven2/org/jboss/narayana/jts/narayana-jts-integration/5.12.4.Final/narayana-jts-integration-5.12.4.Final.jar curl -O https://repo1.maven.org/maven2/org/apache/shardingsphere/shardingsphere-transaction-xa-narayana/5.3.2/shardingsphere-transaction-xa-narayana-5.3.2.jar ``` Add jbossts-properties.xml at conf ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="CoordinatorEnvironmentBean.commitOnePhase">YES</entry> <entry key="ObjectStoreEnvironmentBean.transactionSync">ON</entry> <entry key="CoreEnvironmentBean.nodeIdentifier">1</entry> <entry key="JTAEnvironmentBean.xaRecoveryNodes">1</entry> <entry key="JTAEnvironmentBean.xaResourceOrphanFilterClassNames"> com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter com.arjuna.ats.internal.jta.recovery.arjunacore.JTAActionStatusServiceXAResourceOrphanFilter </entry> <entry key="CoreEnvironmentBean.socketProcessIdPort">0</entry> <entry key="RecoveryEnvironmentBean.recoveryModuleClassNames"> com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule </entry> <entry key="RecoveryEnvironmentBean.expiryScannerClassNames"> com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner </entry> <entry key="RecoveryEnvironmentBean.recoveryPort">4712</entry> <entry key="RecoveryEnvironmentBean.recoveryAddress"></entry> <entry key="RecoveryEnvironmentBean.transactionStatusManagerPort">0</entry> <entry key="RecoveryEnvironmentBean.transactionStatusManagerAddress"></entry> <entry key="RecoveryEnvironmentBean.recoveryListener">NO</entry> <entry key="RecoveryEnvironmentBean.recoveryBackoffPeriod">1</entry> </properties> ``` Run ShardingSphere Proxy successfully. Switch to Narayana and success: `ALTER TRANSACTION RULE(DEFAULT="XA",TYPE(NAME="Narayana"));` 。`show transaction rule;` Create Database\DataSource\SharingRule by DistSQL: ```sql create database transaction; \c transaction; register storage unit test1 ( URL="jdbc:postgresql://xxx:5432/test1", USER="root", PASSWORD="xxx", PROPERTIES("idleTimeout"="30000") ); register storage unit test2 ( URL="jdbc:postgresql://xxx:5432/test2", USER="root", PASSWORD="xxx", PROPERTIES("idleTimeout"="30000") ); register storage unit test3 ( URL="jdbc:postgresql://xxx:5432/test3", USER="root", PASSWORD="xxx", PROPERTIES("idleTimeout"="30000") ); register storage unit test4 ( URL="jdbc:postgresql://xxx:5432/test4", USER="root", PASSWORD="xxx", PROPERTIES("idleTimeout"="30000") ); create SHARDING table rule sbtest1( storage_units(test1,test2,test3,test4), sharding_column=id, type(name="MOD",properties("sharding-count"=8)) ); ``` Create table by sysbench: ``` query = string.format([[ CREATE TABLE sbtest%d( id %s, k INTEGER DEFAULT '0' NOT NULL, c CHAR(2550) DEFAULT '' NOT NULL, pad CHAR(2550) DEFAULT '' NOT NULL, %s (id) ) %s %s]], table_num, id_def, id_index_def, engine_def, extra_table_options) ``` Test SQL route success: `preview select * from sbtest1;` It route to 4 datasources,8 tables; Test transaction failed: ```sql SET DIST VARIABLE sql_show = true; begin; INSERT INTO sbtest1(id, k, c, pad) VALUES(9990, 6, '68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441', '22195207048-70116052123-74140395089-76317954521-98694025897'); INSERT INTO sbtest1(id, k, c, pad) VALUES(9991, 6, '68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441', '22195207048-70116052123-74140395089-76317954521-98694025897'); INSERT INTO sbtest1(id, k, c, pad) VALUES(9992, 6, '68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441', '22195207048-70116052123-74140395089-76317954521-98694025897'); INSERT INTO sbtest1(id, k, c, pad) VALUES(9993, 6, '68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441', '22195207048-70116052123-74140395089-76317954521-98694025897'); commit; ``` ### Expected behavior Return commit success; ### Actual behavior SharingSphere Proxy return : `ERROR: ARJUNA016053: Could not commit transaction.` Here is ShardingSphere Proxy's Log: ``` [WARN ] 2023-05-09 15:27:32.431 [Connection-2-ThreadExecutor] com.arjuna.ats.jta - ARJUNA016133: Cannot create a new instance of Xid of uid 0:ffff0a3e004f:ab54:6459f2b4:22, is branch: true, eisname: 0 java.lang.IllegalStateException: ARJUNA016111: The node identifier cannot be null at com.arjuna.ats.jta.xa.XATxConverter.getXid(XATxConverter.java:97) at com.arjuna.ats.jta.xa.XATxConverter.getXid(XATxConverter.java:62) at com.arjuna.ats.jta.xa.XidImple.<init>(XidImple.java:92) at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.createXid(TransactionImple.java:1630) at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.enlistResource(TransactionImple.java:606) at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.enlistResource(TransactionImple.java:422) at org.apache.shardingsphere.transaction.xa.jta.datasource.XATransactionDataSource.getConnection(XATransactionDataSource.java:90) at org.apache.shardingsphere.transaction.xa.XAShardingSphereTransactionManager.getConnection(XAShardingSphereTransactionManager.java:91) at org.apache.shardingsphere.proxy.backend.connector.jdbc.datasource.JDBCBackendDataSource.createConnection(JDBCBackendDataSource.java:109) at org.apache.shardingsphere.proxy.backend.connector.jdbc.datasource.JDBCBackendDataSource.getConnections(JDBCBackendDataSource.java:80) at org.apache.shardingsphere.proxy.backend.connector.jdbc.datasource.JDBCBackendDataSource.getConnections(JDBCBackendDataSource.java:53) at org.apache.shardingsphere.proxy.backend.connector.BackendConnection.createNewConnections(BackendConnection.java:109) at org.apache.shardingsphere.proxy.backend.connector.BackendConnection.getConnections(BackendConnection.java:91) at org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine.group(DriverExecutionPrepareEngine.java:88) at org.apache.shardingsphere.infra.executor.sql.prepare.AbstractExecutionPrepareEngine.prepare(AbstractExecutionPrepareEngine.java:65) at org.apache.shardingsphere.proxy.backend.connector.ProxySQLExecutor.useDriverToExecute(ProxySQLExecutor.java:189) at org.apache.shardingsphere.proxy.backend.connector.ProxySQLExecutor.execute(ProxySQLExecutor.java:156) at org.apache.shardingsphere.proxy.backend.connector.DatabaseConnector.doExecute(DatabaseConnector.java:263) at org.apache.shardingsphere.proxy.backend.connector.DatabaseConnector.doExecute(DatabaseConnector.java:249) at org.apache.shardingsphere.proxy.backend.connector.DatabaseConnector.execute(DatabaseConnector.java:209) at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.simple.PostgreSQLComQueryExecutor.execute(PostgreSQLComQueryExecutor.java:77) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.doExecuteCommand(CommandExecutorTask.java:114) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:109) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.java:77) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) [WARN ] 2023-05-09 15:27:35.289 [Connection-2-ThreadExecutor] com.arjuna.ats.jta - ARJUNA016041: prepare on ARJUNA016100: Xid unset (org.apache.shardingsphere.transaction.xa.spi.SingleXAResource@25ec8ca) failed with exception - java.lang.NullPointerException: null at org.postgresql.xa.RecoveredXid.xidToString(RecoveredXid.java:79) at org.postgresql.xa.PGXAConnection.prepare(PGXAConnection.java:353) at org.apache.shardingsphere.transaction.xa.spi.SingleXAResource.prepare(SingleXAResource.java:66) at com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord.topLevelPrepare(XAResourceRecord.java:214) at com.arjuna.ats.arjuna.coordinator.BasicAction.doPrepare(BasicAction.java:2678) at com.arjuna.ats.arjuna.coordinator.BasicAction.doPrepare(BasicAction.java:2628) at com.arjuna.ats.arjuna.coordinator.BasicAction.prepare(BasicAction.java:2162) at com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1508) at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:96) at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162) at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1295) at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:128) at org.apache.shardingsphere.transaction.xa.XAShardingSphereTransactionManager.commit(XAShardingSphereTransactionManager.java:118) at org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction.BackendTransactionManager.commit(BackendTransactionManager.java:94) at org.apache.shardingsphere.proxy.backend.handler.transaction.TransactionBackendHandler.execute(TransactionBackendHandler.java:84) at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.simple.PostgreSQLComQueryExecutor.execute(PostgreSQLComQueryExecutor.java:77) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.doExecuteCommand(CommandExecutorTask.java:114) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:109) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.java:77) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) [WARN ] 2023-05-09 15:27:35.289 [Connection-2-ThreadExecutor] com.arjuna.ats.arjuna - ARJUNA012073: BasicAction.End() - prepare phase of action-id 0:ffff0a3e004f:ab54:6459f2b4:22 failed. [WARN ] 2023-05-09 15:27:35.289 [Connection-2-ThreadExecutor] com.arjuna.ats.arjuna - ARJUNA012075: Action Aborting [WARN ] 2023-05-09 15:27:35.289 [Connection-2-ThreadExecutor] com.arjuna.ats.jta - ARJUNA016045: attempted rollback of ARJUNA016100: Xid unset (org.apache.shardingsphere.transaction.xa.spi.SingleXAResource@25ec8ca) failed with exception code - java.lang.NullPointerException: null at org.postgresql.xa.RecoveredXid.xidToString(RecoveredXid.java:79) at org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:457) at org.apache.shardingsphere.transaction.xa.spi.SingleXAResource.rollback(SingleXAResource.java:76) at com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord.topLevelAbort(XAResourceRecord.java:362) at com.arjuna.ats.arjuna.coordinator.BasicAction.doAbort(BasicAction.java:3037) at com.arjuna.ats.arjuna.coordinator.BasicAction.doAbort(BasicAction.java:3016) at com.arjuna.ats.arjuna.coordinator.BasicAction.phase2Abort(BasicAction.java:1986) at com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1524) at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:96) at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162) at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1295) at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:128) at org.apache.shardingsphere.transaction.xa.XAShardingSphereTransactionManager.commit(XAShardingSphereTransactionManager.java:118) at org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction.BackendTransactionManager.commit(BackendTransactionManager.java:94) at org.apache.shardingsphere.proxy.backend.handler.transaction.TransactionBackendHandler.execute(TransactionBackendHandler.java:84) at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.simple.PostgreSQLComQueryExecutor.execute(PostgreSQLComQueryExecutor.java:77) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.doExecuteCommand(CommandExecutorTask.java:114) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:109) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.java:77) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) [WARN ] 2023-05-09 15:27:35.290 [Connection-2-ThreadExecutor] com.arjuna.ats.arjuna - ARJUNA012091: Top-level abort of action 0:ffff0a3e004f:ab54:6459f2b4:22 received TwoPhaseOutcome.FINISH_ERROR from com.arjuna.ats.arjuna.coordinator.AbstractRecord [ERROR] 2023-05-09 15:27:35.293 [Connection-2-ThreadExecutor] o.a.s.p.f.c.CommandExecutorTask - Exception occur: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction. at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1307) at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:128) at org.apache.shardingsphere.transaction.xa.XAShardingSphereTransactionManager.commit(XAShardingSphereTransactionManager.java:118) at org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction.BackendTransactionManager.commit(BackendTransactionManager.java:94) at org.apache.shardingsphere.proxy.backend.handler.transaction.TransactionBackendHandler.execute(TransactionBackendHandler.java:84) at org.apache.shardingsphere.proxy.frontend.postgresql.command.query.simple.PostgreSQLComQueryExecutor.execute(PostgreSQLComQueryExecutor.java:77) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.doExecuteCommand(CommandExecutorTask.java:114) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:109) at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.java:77) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) ``` ### Reason analyze (If you can) I configure ShardingSphere Proxy by Doc, the Local mod is success, XA get the problem. I am not familiar with Narayana, it maybe wrong with jbossts-properties.xml. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
