You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/09/23 11:59:52 UTC
svn commit: r1000385 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java
test/java/org/apache/jackrabbit/core/XATest.java
Author: jukka
Date: Thu Sep 23 09:59:52 2010
New Revision: 1000385
URL: http://svn.apache.org/viewvc?rev=1000385&view=rev
Log:
JCR-2712: Dirty Internal State on Transaction-Rollback during Global Transaction (container managed transaction)
Make sure that the versioning lock covers an entire XA transaction
even when the transaction manager does not call prepare() before a
commit() or a rollback(). This also guarantees that proper cleanup
will happen during a rollback() without a preceding prepare().
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java?rev=1000385&r1=1000384&r2=1000385&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalXAVersionManager.java Thu Sep 23 09:59:52 2010
@@ -655,9 +655,17 @@ public class InternalXAVersionManager ex
}
public void commit(TransactionContext tx) {
+ // JCR-2712: Ensure that the transaction is prepared
+ if (!vmgrLocked) {
+ prepare(tx);
+ }
}
public void rollback(TransactionContext tx) {
+ // JCR-2712: Ensure that the transaction is prepared
+ if (!vmgrLocked) {
+ prepare(tx);
+ }
}
public void afterOperation(TransactionContext tx) {
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java?rev=1000385&r1=1000384&r2=1000385&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java Thu Sep 23 09:59:52 2010
@@ -30,6 +30,7 @@ import javax.jcr.version.VersionExceptio
import javax.jcr.version.Version;
import javax.jcr.lock.Lock;
import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.NodeType;
import javax.transaction.UserTransaction;
import javax.transaction.RollbackException;
import java.util.StringTokenizer;
@@ -105,6 +106,33 @@ public class XATest extends AbstractJCRT
}
/**
+ * Test case for
+ * <a href="https://issues.apache.org/jira/browse/JCR-2712">JCR-2712</a>.
+ */
+ public void testVersioningRollbackWithoutPrepare() throws Exception {
+ Session session = getHelper().getSuperuserSession();
+ try {
+ if (session.getRootNode().hasNode("testNode")) {
+ session.getRootNode().getNode("testNode").remove();
+ session.save();
+ }
+
+ UserTransaction utx;
+ for (int i = 0; i < 50; i++) {
+ utx = new UserTransactionImpl(session);
+ utx.begin();
+ session.getRootNode().addNode("testNode").addMixin(
+ NodeType.MIX_VERSIONABLE);
+ session.save();
+
+ utx.rollback();
+ }
+ } finally {
+ session.logout();
+ }
+ }
+
+ /**
* Add a node inside a transaction and commit changes. Make sure
* node exists for other sessions only after commit.
* @throws Exception