[ http://issues.apache.org/jira/browse/DERBY-246?page=all ]
Kathey Marsden updated DERBY-246:
---------------------------------
Attachment: derby246.diff
Attached is a patch for DERBY-246.
For the client there were multiple problems associated with the tracking
of XA_STATE in the client. The approach for this patch is to remove as
much of the client state as possible.
This patch removes all the client XA state except for
XA_GLOBAL - In an active global transaction
XA_LOCAL - No active global transaction.
For Network Server there was a bug that the connection was not being
reset properly when a connection
reset request came from the client. Changed it so that if an ACCRDB
is sent and a connection has already been established it will reset.
There is still a fair amount of cleanup to do for xa in the client. Including
changing the values above to a single boolean value.
That will come in follow up patches. I will also file bugs for some
other client XA issues I am looking at.
I will commit this probably at noon today, but would appreciate review before or
after checkin.
> XA end() fails with Connection is closed error
> ----------------------------------------------
>
> Key: DERBY-246
> URL: http://issues.apache.org/jira/browse/DERBY-246
> Project: Derby
> Type: Bug
> Components: Network Client
> Versions: 10.1.0.0
> Environment: I am using the 10.1.0 alpha build.
> Reporter: Dibyendu Majumdar
> Assignee: Kathey Marsden
> Attachments: derby246.diff
>
> I am testing ClientXADataSource.
> It fails when end() is called - here is the output fromn my test program.
> Running test org.simplejta.xatests.common.Test1
> autocommit = false
> No of rows Affected 1
> autocommit = true
> No of rows Affected 1
> org.apache.derby.client.am.XaException: XAER_RMFAIL : Connection is Closed.
> at org.apache.derby.client.net.NetXAResource.throwXAException(Unknown
> Source)
> at org.apache.derby.client.net.NetXAResource.throwXAException(Unknown
> Source)
> at
> org.apache.derby.client.net.NetXAResource.connectionClosedFailure(Unknown
> Source)
> at org.apache.derby.client.net.NetXAResource.end(Unknown Source)
> at org.simplejta.xatests.common.Test1.doTest(Test1.java:52)
> at org.simplejta.tests.DerbyClientTests.main(DerbyClientTests.java:66)
> Caused by: org.apache.derby.client.am.SqlException: Connection is Closed.
> ... 4 more
> Test org.simplejta.xatests.common.Test1 failed
> The test program is:
> /*
> * Test case for multiple logical connections between start() and end().
> */
> package org.simplejta.xatests.common;
> import java.sql.Connection;
> import java.sql.SQLException;
> import java.sql.Statement;
> import javax.sql.XAConnection;
> import javax.sql.XADataSource;
> import javax.transaction.xa.XAResource;
> import javax.transaction.xa.Xid;
> public class Test1 extends TestCase {
> public void doTest(XADataSource ds) throws Exception {
> // Get a XA connection to the underlying data source
> XAConnection pc1 = ds.getXAConnection();
> // Get the XA Resource
> XAResource xar1 = pc1.getXAResource();
> // Create an Xid
> Xid xid1 = Utils.createXid(1);
> // Start the XA transaction
> xar1.start(xid1, XAResource.TMNOFLAGS);
> // Get a Logical Connection
> Connection conn1 = pc1.getConnection();
> System.out.println("autocommit = " + conn1.getAutoCommit());
> // Do something with conn1
> doSomeWork1(conn1, 50);
> // Close the logical connection
> conn1.close();
> // Get another logical connection
> conn1 = pc1.getConnection();
> System.out.println("autocommit = " + conn1.getAutoCommit());
> // Do something with conn1
> doSomeWork1(conn1, 51);
> // Close the logical connection
> conn1.close();
> // END the branche
> xar1.end(xid1, XAResource.TMSUCCESS);
> // Prepare the RMs
> int prp1 = xar1.prepare(xid1);
> // Commit transaction
> xar1.commit(xid1, false);
> // Close physical connection
> pc1.close();
> }
> private void doSomeWork1(Connection conn, int deptno) throws SQLException
> {
> Statement stmt = conn.createStatement();
> int cnt = stmt
> .executeUpdate("INSERT INTO dept VALUES (" + deptno + ",
> 'BSD', 'LONDON')");
> System.out.println("No of rows Affected " + cnt);
> stmt.close();
> stmt = null;
> }
> }
> This test works fine with EmbeddedXADataSource. It also works fine with
> Oracle.
> Also, note that this error seems similar to the error I am getting with DB2
> using the DB2 type 4 driver.
> Running test org.simplejta.xatests.common.Test1
> autocommit = false
> No of rows Affected 1
> autocommit = false
> No of rows Affected 1
> com.ibm.db2.jcc.b.de: XAER_RMFAIL : Connection is Closed. : Exception from
> native code during XA
> at com.ibm.db2.jcc.uw.UWXAResource.a(UWXAResource.java:695)
> at com.ibm.db2.jcc.uw.UWXAResource.a(UWXAResource.java:709)
> at com.ibm.db2.jcc.uw.UWXAResource.end(UWXAResource.java:227)
> at org.simplejta.xatests.common.Test1.doTest(Test1.java:52)
> at org.simplejta.tests.DB2Tests.main(DB2Tests.java:65)
> Caused by: com.ibm.db2.jcc.b.SqlException: Connection is Closed.
> at com.ibm.db2.jcc.uw.UWXAResource.a(UWXAResource.java:705)
> ... 3 more
> Test org.simplejta.xatests.common.Test1 failed
> Curiously, the error appears to corrupt the database. Subsequent attempts to
> start the database gives an error.
> org.apache.derby.client.am.SqlException: DERBY SQL error: SQLCODE: -1,
> SQLSTATE: XJ040, SQLERRMC:
> tca[..snip..]XJ040.C..[snip]..STB0:XSTB0.M..[snip]..led to start database
> 'tca', see the next exception for details...[snip]..An exception was thrown
> during transaction abort...[snip]..(server log:c:\derby\databases\derby.log)
> at org.apache.derby.client.am.Connection.completeSqlca(Unknown Source)
> at
> org.apache.derby.client.net.NetConnectionReply.parseRdbAccessFailed(Unknown
> Source)
> at
> org.apache.derby.client.net.NetConnectionReply.parseAccessRdbError(Unknown
> Source)
> at
> org.apache.derby.client.net.NetConnectionReply.parseACCRDBreply(Unknown
> Source)
> at
> org.apache.derby.client.net.NetConnectionReply.readAccessDatabase(Unknown
> Source)
> at
> org.apache.derby.client.net.NetConnection.readSecurityCheckAndAccessRdb(Unknown
> Source)
> at
> org.apache.derby.client.net.NetConnection.flowSecurityCheckAndAccessRdb(Unknown
> Source)
> at
> org.apache.derby.client.net.NetConnection.flowUSRIDPWDconnect(Unknown Source)
> at org.apache.derby.client.net.NetConnection.flowConnect(Unknown Source)
> at org.apache.derby.client.net.NetConnection.initialize(Unknown Source)
> at org.apache.derby.client.net.NetConnection.<init>(Unknown Source)
> at org.apache.derby.client.net.NetXAConnection.<init>(Unknown Source)
> at org.apache.derby.client.ClientPooledConnection.<init>(Unknown Source)
> at org.apache.derby.client.ClientXAConnection.<init>(Unknown Source)
> at org.apache.derby.jdbc.ClientXADataSource.getXAConnection(Unknown
> Source)
> at org.apache.derby.jdbc.ClientXADataSource.getXAConnection(Unknown
> Source)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira