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 2009/03/04 12:18:35 UTC

svn commit: r749965 - /jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java

Author: jukka
Date: Wed Mar  4 11:18:35 2009
New Revision: 749965

URL: http://svn.apache.org/viewvc?rev=749965&view=rev
Log:
JCR-2000: Deadlock on concurrent commits

Create test nodes within a transaction to avoid mixing transactional and non-transactional writes.

Modified:
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java?rev=749965&r1=749964&r2=749965&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java Wed Mar  4 11:18:35 2009
@@ -46,6 +46,27 @@
      */
     private static final int NUM_OPERATIONS = 100;
 
+    /**
+     * Creates the named test node. The node is created within a transaction
+     * to avoid mixing transactional and non-transactional writes within a
+     * concurrent test run.
+     */
+    private static synchronized Node createParentNode(Node test, String name)
+            throws RepositoryException {
+        try {
+            UserTransaction utx = new UserTransactionImpl(test.getSession());
+            utx.begin();
+            Node parent = test.addNode(name);
+            test.save();
+            utx.commit();
+            return parent;
+        } catch (RepositoryException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new RepositoryException("Failed to add node: " + name, e);
+        }
+    }
+
     public void testConcurrentAddVersionableInTransaction()
             throws RepositoryException {
         runTask(new Task() {
@@ -53,11 +74,7 @@
                     throws RepositoryException {
                 // add versionable nodes
                 final String threadName = Thread.currentThread().getName();
-                Node parent;
-                synchronized (ConcurrentVersioningWithTransactionsTest.class) {
-                    parent = test.addNode(threadName);
-                    test.save();
-                }
+                Node parent = createParentNode(test, threadName);
                 for (int i = 0; i < NUM_OPERATIONS / CONCURRENCY; i++) {
                     try {
                         final UserTransaction utx = new UserTransactionImpl(test.getSession());