[Mulgara-svn] r1069 - branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver

ronald at mulgara.org ronald at mulgara.org
Mon Jul 7 14:26:51 UTC 2008


Author: ronald
Date: 2008-07-07 07:26:50 -0700 (Mon, 07 Jul 2008)
New Revision: 1069

Modified:
   branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/ExternalTransactionUnitTest.java
   branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransaction.java
Log:
Fix screwup in r1066 that broke insert-select and delete-select when using
external transactions: lastActive may be -1 when execute() is reentered
recursively, so use an explicit flag to check for completed transactions.


Modified: branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/ExternalTransactionUnitTest.java
===================================================================
--- branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/ExternalTransactionUnitTest.java	2008-07-07 13:31:13 UTC (rev 1068)
+++ branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/ExternalTransactionUnitTest.java	2008-07-07 14:26:50 UTC (rev 1069)
@@ -105,6 +105,7 @@
     suite.addTest(new ExternalTransactionUnitTest("testSimpleOnePhaseCommit"));
     suite.addTest(new ExternalTransactionUnitTest("testSimpleTwoPhaseCommit"));
     suite.addTest(new ExternalTransactionUnitTest("testBasicQuery"));
+    suite.addTest(new ExternalTransactionUnitTest("testBasicUpdate"));
     suite.addTest(new ExternalTransactionUnitTest("testMultipleQuery"));
     suite.addTest(new ExternalTransactionUnitTest("testBasicReadOnlyQuery"));
     suite.addTest(new ExternalTransactionUnitTest("testConcurrentQuery"));
@@ -318,6 +319,113 @@
     }
   }
 
+  public void testBasicUpdate() throws URISyntaxException {
+    logger.info("Testing basicUpdate");
+
+    // straight insert and delete
+    try {
+      DatabaseSession session = (DatabaseSession)database.newSession();
+      try {
+        // start txn
+        XAResource resource = session.getXAResource();
+        Xid xid = new TestXid(1);
+        resource.start(xid, XAResource.TMNOFLAGS);
+
+        session.createModel(model2URI, null);
+
+        // insert data
+        session.insert(model2URI, Collections.singleton(new TripleImpl(
+            new URIReferenceImpl(URI.create("test:a")),
+            new URIReferenceImpl(URI.create("test:b")),
+            new URIReferenceImpl(URI.create("test:c")))));
+
+        // check it
+        Answer answer = session.query(createQuery(model2URI));
+        answer.beforeFirst();
+        assertTrue(answer.next());
+        assertEquals(new URIReferenceImpl(new URI("test:a")), answer.getObject(0));
+        assertEquals(new URIReferenceImpl(new URI("test:b")), answer.getObject(1));
+        assertEquals(new URIReferenceImpl(new URI("test:c")), answer.getObject(2));
+        assertFalse(answer.next());
+        answer.close();
+
+        // delete it
+        session.delete(model2URI, Collections.singleton(new TripleImpl(
+            new URIReferenceImpl(URI.create("test:a")),
+            new URIReferenceImpl(URI.create("test:b")),
+            new URIReferenceImpl(URI.create("test:c")))));
+
+        // check it
+        answer = session.query(createQuery(model2URI));
+        answer.beforeFirst();
+        assertFalse(answer.next());
+        answer.close();
+
+        session.removeModel(model2URI);
+
+        resource.end(xid, XAResource.TMSUCCESS);
+        resource.commit(xid, true);
+      } finally {
+        session.close();
+      }
+    } catch (Exception e) {
+      fail(e);
+    }
+
+    // insert-select and delete-select
+    try {
+      DatabaseSession session = (DatabaseSession)database.newSession();
+      try {
+        // start txn
+        XAResource resource = session.getXAResource();
+        Xid xid = new TestXid(1);
+        resource.start(xid, XAResource.TMNOFLAGS);
+
+        session.createModel(model2URI, null);
+        session.createModel(model3URI, null);
+
+        // insert data
+        session.insert(model2URI, Collections.singleton(new TripleImpl(
+            new URIReferenceImpl(URI.create("test:a")),
+            new URIReferenceImpl(URI.create("test:b")),
+            new URIReferenceImpl(URI.create("test:c")))));
+
+        // insert-select
+        session.insert(model3URI, createQuery(model2URI));
+
+        // check it
+        Answer answer = session.query(createQuery(model3URI));
+        answer.beforeFirst();
+        assertTrue(answer.next());
+        assertEquals(new URIReferenceImpl(new URI("test:a")), answer.getObject(0));
+        assertEquals(new URIReferenceImpl(new URI("test:b")), answer.getObject(1));
+        assertEquals(new URIReferenceImpl(new URI("test:c")), answer.getObject(2));
+        assertFalse(answer.next());
+        answer.close();
+
+        // delete it
+        session.delete(model3URI, createQuery(model2URI));
+
+        // check it
+        answer = session.query(createQuery(model3URI));
+        answer.beforeFirst();
+        assertFalse(answer.next());
+        answer.close();
+
+        // clean up
+        session.removeModel(model2URI);
+        session.removeModel(model3URI);
+
+        resource.end(xid, XAResource.TMSUCCESS);
+        resource.commit(xid, true);
+      } finally {
+        session.close();
+      }
+    } catch (Exception e) {
+      fail(e);
+    }
+  }
+
   public void testMultipleQuery() throws URISyntaxException {
     logger.info("Testing MultipleQuery");
 

Modified: branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransaction.java
===================================================================
--- branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransaction.java	2008-07-07 13:31:13 UTC (rev 1068)
+++ branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransaction.java	2008-07-07 14:26:50 UTC (rev 1069)
@@ -70,6 +70,7 @@
   private int heurCode;
   private boolean rollback;
   private String rollbackCause;
+  private boolean completed;
   private volatile long lastActive;
 
   MulgaraExternalTransaction(MulgaraExternalTransactionFactory factory, Xid xid, DatabaseOperationContext context)
@@ -90,6 +91,7 @@
     this.hRollback = false;
     this.heurCode = 0;
     this.rollback = false;
+    this.completed = false;
     this.lastActive = System.currentTimeMillis();
 
     this.context.initiate(this);
@@ -123,6 +125,7 @@
 
         return new MulgaraTransactionException(errorMessage, cause);
       } finally {
+        completed = true;
         factory.transactionComplete(this);
       }
     } finally {
@@ -239,7 +242,7 @@
       throw factory.newException(exc, "Transaction was heuristically rolled back. Reason: " + rollbackCause);
     if (rollback)
       throw factory.newException(exc, "Transaction was rolled back. Reason: " + rollbackCause);
-    if (lastActive < 0)
+    if (completed)
       throw factory.newException(exc, "Transaction has been completed");
   }
 
@@ -432,6 +435,8 @@
         logger.error("Failed to abort transaction on cleanup failure", em2);
         throw new XAException(XAException.XAER_RMFAIL);
       }
+    } finally {
+      completed = true;
     }
   }
 




More information about the Mulgara-svn mailing list