db-derby-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kahat...@apache.org
Subject svn commit: r1230914 - in /db/derby/code/branches/10.8: ./ java/client/org/apache/derby/client/net/ java/engine/org/apache/derby/jdbc/ java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/
Date Fri, 13 Jan 2012 08:20:30 GMT
Author: kahatlen
Date: Fri Jan 13 08:20:29 2012
New Revision: 1230914

URL: http://svn.apache.org/viewvc?rev=1230914&view=rev
Log:
DERBY-5562: A read-only XA transaction that has a timeout never has the timer canceled when
the transaction is complete

Merged fix from trunk (revision 1230480).

Modified:
    db/derby/code/branches/10.8/   (props changed)
    db/derby/code/branches/10.8/java/client/org/apache/derby/client/net/NetCursor.java   (props
changed)
    db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/XATransactionState.java
    db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATransactionTest.java

Propchange: db/derby/code/branches/10.8/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jan 13 08:20:29 2012
@@ -1,2 +1,2 @@
 /db/derby/code/branches/10.7:1061570,1061578,1082235
-/db/derby/code/trunk:1063809,1088633,1089795,1091000,1091221,1091285,1092067,1092795,1094315,1094572,1094728,1095247,1096741,1096890,1096991,1097247,1097249,1097460,1097469,1097471,1098033,1101059,1101839,1102620,1102826,1103681,1103718,1103742,1104365,1125305,1126358,1126468,1127825,1127883,1128243,1128942,1129136,1129764,1129797,1130077,1130084,1130632,1130895,1131030,1131272,1132546,1132664,1132747,1132860,1132928,1133304,1133317,1133741,1133752,1134139,1136363,1136371,1136397,1136844,1137213,1138201,1138341,1138444,1138787,1138795,1139449,1139451,1140222,1140744,1141924,1142583,1142635,1145057,1146644,1146915,1146962,1147219,1147242,1147335,1148344,1148354,1148429,1148658,1149054,1149090,1149270,1149482,1149662,1151101,1151612,1158108,1160593,1160597,1161208,1162737,1163131,1163616,1164358,1164370,1164495,1165221,1166313,1167017,1167226,1167470,1169692,1170470,1171227,1171665,1171672,1173446,1173647,1174436,1174646,1176633,1176636,1177589,1179374,1179546,1180790,1180858,
 1181756,1183463,1183503,1183671,1186020,1186691,1189201,1189222,1203050,1203252,1204128,1207729,1208775,1210846,1212541,1213251
+/db/derby/code/trunk:1063809,1088633,1089795,1091000,1091221,1091285,1092067,1092795,1094315,1094572,1094728,1095247,1096741,1096890,1096991,1097247,1097249,1097460,1097469,1097471,1098033,1101059,1101839,1102620,1102826,1103681,1103718,1103742,1104365,1125305,1126358,1126468,1127825,1127883,1128243,1128942,1129136,1129764,1129797,1130077,1130084,1130632,1130895,1131030,1131272,1132546,1132664,1132747,1132860,1132928,1133304,1133317,1133741,1133752,1134139,1136363,1136371,1136397,1136844,1137213,1138201,1138341,1138444,1138787,1138795,1139449,1139451,1140222,1140744,1141924,1142583,1142635,1145057,1146644,1146915,1146962,1147219,1147242,1147335,1148344,1148354,1148429,1148658,1149054,1149090,1149270,1149482,1149662,1151101,1151612,1158108,1160593,1160597,1161208,1162737,1163131,1163616,1164358,1164370,1164495,1165221,1166313,1167017,1167226,1167470,1169692,1170470,1171227,1171665,1171672,1173446,1173647,1174436,1174646,1176633,1176636,1177589,1179374,1179546,1180790,1180858,
 1181756,1183463,1183503,1183671,1186020,1186691,1189201,1189222,1203050,1203252,1204128,1207729,1208775,1210846,1212541,1213251,1230480

Propchange: db/derby/code/branches/10.8/java/client/org/apache/derby/client/net/NetCursor.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jan 13 08:20:29 2012
@@ -1,2 +1,2 @@
 /db/derby/code/branches/10.7/java/client/org/apache/derby/client/net/NetCursor.java:1061570,1061578,1082235
-/db/derby/code/trunk/java/client/org/apache/derby/client/net/NetCursor.java:1063809,1088633,1089795,1091000,1091221,1091285,1092067,1092795,1094315,1094572,1094728,1095247,1096741,1096890,1096991,1097247,1097249,1097460,1097469,1097471,1098033,1101059,1101839,1102620,1102826,1103681,1103718,1103742,1104365,1125305,1126358,1126468,1127825,1127883,1128243,1128942,1129136,1129764,1129797,1130077,1130084,1130632,1130895,1131030,1131272,1132546,1132664,1132747,1132860,1132928,1133304,1133317,1133741,1133752,1134139,1136363,1136371,1136397,1136844,1137213,1138201,1138341,1138444,1138787,1138795,1139449,1139451,1140222,1140744,1141924,1142583,1142635,1145057,1145961,1146644,1146915,1146962,1147219,1147242,1147335,1148344,1148354,1148429,1148658,1149054,1149090,1149270,1149482,1149662,1151101,1151612,1158108,1160593,1160597,1161208,1162737,1163131,1163616,1164358,1164370,1164495,1165221,1167017,1167470,1169692,1171665,1171672,1173647,1174436,1176633,1176636,1177589,1179374,1179546,1
 180790,1180858,1181756,1183463,1183671,1186020,1186691,1203252,1210846,1213251
+/db/derby/code/trunk/java/client/org/apache/derby/client/net/NetCursor.java:1063809,1088633,1089795,1091000,1091221,1091285,1092067,1092795,1094315,1094572,1094728,1095247,1096741,1096890,1096991,1097247,1097249,1097460,1097469,1097471,1098033,1101059,1101839,1102620,1102826,1103681,1103718,1103742,1104365,1125305,1126358,1126468,1127825,1127883,1128243,1128942,1129136,1129764,1129797,1130077,1130084,1130632,1130895,1131030,1131272,1132546,1132664,1132747,1132860,1132928,1133304,1133317,1133741,1133752,1134139,1136363,1136371,1136397,1136844,1137213,1138201,1138341,1138444,1138787,1138795,1139449,1139451,1140222,1140744,1141924,1142583,1142635,1145057,1145961,1146644,1146915,1146962,1147219,1147242,1147335,1148344,1148354,1148429,1148658,1149054,1149090,1149270,1149482,1149662,1151101,1151612,1158108,1160593,1160597,1161208,1162737,1163131,1163616,1164358,1164370,1164495,1165221,1167017,1167470,1169692,1171665,1171672,1173647,1174436,1176633,1176636,1177589,1179374,1179546,1
 180790,1180858,1181756,1183463,1183671,1186020,1186691,1203252,1210846,1213251,1230480

Modified: db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/XATransactionState.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/XATransactionState.java?rev=1230914&r1=1230913&r2=1230914&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/XATransactionState.java
(original)
+++ db/derby/code/branches/10.8/java/engine/org/apache/derby/jdbc/XATransactionState.java
Fri Jan 13 08:20:29 2012
@@ -33,6 +33,7 @@ import org.apache.derby.iapi.services.co
 import org.apache.derby.iapi.services.context.ContextManager;
 import org.apache.derby.iapi.error.ExceptionSeverity;
 import org.apache.derby.iapi.error.StandardException;
+import org.apache.derby.iapi.store.access.XATransactionController;
 import org.apache.derby.iapi.store.access.xa.XAXactId;
 import org.apache.derby.iapi.reference.SQLState;
 import java.util.HashMap;
@@ -357,13 +358,21 @@ final class XATransactionState extends C
      */
     synchronized int xa_prepare() throws SQLException {
         int retVal = conn.xa_prepare();
+
+        if (retVal == XATransactionController.XA_RDONLY) {
+            // Read-only transactions are implicitly committed when they are
+            // prepared. Since the transaction has completed, the timeout task
+            // should be cancelled now. DERBY-5562.
+            xa_finalize();
+        }
+
         return retVal;
     }
 
     /** This method cancels timeoutTask and assigns
       * 'performTimeoutRollback = false'.
       */
-    synchronized void xa_finalize() {
+    private void xa_finalize() {
         if (timeoutTask != null) {
             timeoutTask.cancel();
             timeoutTask = null;

Modified: db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATransactionTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATransactionTest.java?rev=1230914&r1=1230913&r2=1230914&view=diff
==============================================================================
--- db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATransactionTest.java
(original)
+++ db/derby/code/branches/10.8/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATransactionTest.java
Fri Jan 13 08:20:29 2012
@@ -427,6 +427,88 @@ public class XATransactionTest extends B
         }
     }
 
+    /**
+     * <p>
+     * Regression test case for DERBY-5562.
+     * </p>
+     *
+     * <p>
+     * The timer that aborts long-running transactions if a transaction timeout
+     * has been specified, was not cancelled when preparing a read-only
+     * transaction. Since read-only transactions are implicitly committed when
+     * they are prepared, this meant that the timer would try to abort an
+     * already completed transaction. In addition to printing a confusing
+     * message in derby.log about the transaction being rolled back, when it
+     * actually had been committed, this could also make the timer roll back
+     * the wrong transaction, if a new transaction with the same Xid was
+     * started later.
+     * </p>
+     *
+     * <p>
+     * This test case exposes the bug by running a read-only transaction with
+     * a timeout and preparing it, and then starting a new transaction with the
+     * same Xid and no timeout. The bug would cause the second transaction to
+     * time out.
+     * </p>
+     */
+    public void testDerby5562ReadOnlyTimeout()
+            throws InterruptedException, SQLException, XAException {
+        XADataSource xads = J2EEDataSource.getXADataSource();
+        XAConnection xac = xads.getXAConnection();
+        XAResource xar = xac.getXAResource();
+
+        Xid xid = createXid(55, 62);
+
+        // Set a transaction timeout. This should be relatively short so that
+        // the test case doesn't need to wait very long to trigger the timeout.
+        // However, it needs to be long enough to let the first transaction go
+        // through without hitting the timeout. Hopefully, four seconds is
+        // enough. If the test case starts failing intermittently during the
+        // first transaction, we might have to raise the timeout (and raise the
+        // sleep time in the second transaction correspondingly).
+        assertTrue(xar.setTransactionTimeout(4));
+
+        // Start first transaction.
+        xar.start(xid, XAResource.TMNOFLAGS);
+        Connection c = xac.getConnection();
+        Statement s = c.createStatement();
+        JDBC.assertSingleValueResultSet(
+                s.executeQuery("select * from sysibm.sysdummy1"),
+                "Y");
+        s.close();
+        c.close();
+        xar.end(xid, XAResource.TMSUCCESS);
+
+        // Prepare the first transaction. Since it's a read-only transaction,
+        // it'll be automatically committed, so there's no need to call commit.
+        assertEquals("XA_RDONLY", XAResource.XA_RDONLY, xar.prepare(xid));
+
+        // Reset the timeout for the second transaction.
+        assertTrue(xar.setTransactionTimeout(0));
+
+        // Start second transaction.
+        xar.start(xid, XAResource.TMNOFLAGS);
+        c = xac.getConnection();
+        s = c.createStatement();
+        JDBC.assertSingleValueResultSet(
+                s.executeQuery("select * from sysibm.sysdummy1"),
+                "Y");
+        s.close();
+        c.close();
+
+        // Keep the transaction running so long that it must have exceeded the
+        // timeout for the previous transaction.
+        Thread.sleep(5000);
+
+        // End the transaction. Since there's no timeout on this transaction,
+        // it should work. Before DERBY-5562 was fixed, it would fail because
+        // it had been rolled back by the timer from the previous transaction.
+        xar.end(xid, XAResource.TMSUCCESS);
+        assertEquals("XA_RDONLY", XAResource.XA_RDONLY, xar.prepare(xid));
+
+        xac.close();
+    }
+
     /* ------------------- end helper methods  -------------------------- */
 
     /** Create the Xid object for global transaction identification



Mime
View raw message