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]

Reply via email to