You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2008/03/17 13:47:40 UTC

svn commit: r637865 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/version/ test/java/org/apache/jackrabbit/core/ test/java/org/apache/jackrabbit/core/integration/ test/java/org/apache/jackrabbit/core/integration/rando...

Author: mreutegg
Date: Mon Mar 17 05:47:35 2008
New Revision: 637865

URL: http://svn.apache.org/viewvc?rev=637865&view=rev
Log:
JCR-1480: Deadlock when executing Version operations

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/AbstractConcurrencyTest.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RandomOperationTest.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/CreateNodes.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/OperationFactory.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/ContentOperationsTask.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/RandomOperationsTask.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/VersionOperationsTask.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java?rev=637865&r1=637864&r2=637865&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java Mon Mar 17 05:47:35 2008
@@ -463,7 +463,9 @@
      * Delegate the call to our XA item state manager.
      */
     public void prepare(TransactionContext tx) throws TransactionException {
-        ((XAItemStateManager) stateMgr).prepare(tx);
+        if (vmgrLocked) {
+            ((XAItemStateManager) stateMgr).prepare(tx);
+        }
     }
 
     /**
@@ -473,9 +475,11 @@
      * global repository manager to update its caches.
      */
     public void commit(TransactionContext tx) throws TransactionException {
-        ((XAItemStateManager) stateMgr).commit(tx);
-        Map xaItems = (Map) tx.getAttribute(ITEMS_ATTRIBUTE_NAME);
-        vMgr.itemsUpdated(xaItems.values());
+        if (vmgrLocked) {
+            ((XAItemStateManager) stateMgr).commit(tx);
+            Map xaItems = (Map) tx.getAttribute(ITEMS_ATTRIBUTE_NAME);
+            vMgr.itemsUpdated(xaItems.values());
+        }
     }
 
     /**
@@ -484,7 +488,9 @@
      * Delegate the call to our XA item state manager.
      */
     public void rollback(TransactionContext tx) {
-        ((XAItemStateManager) stateMgr).rollback(tx);
+        if (vmgrLocked) {
+            ((XAItemStateManager) stateMgr).rollback(tx);
+        }
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/AbstractConcurrencyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/AbstractConcurrencyTest.java?rev=637865&r1=637864&r2=637865&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/AbstractConcurrencyTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/AbstractConcurrencyTest.java Mon Mar 17 05:47:35 2008
@@ -108,7 +108,7 @@
         boolean stacksDumped = false;
         for (int i = 0; i < threads.length; i++) {
             try {
-                long wait = Math.max(timeout - System.currentTimeMillis(), 1);
+                long wait = Math.max(timeout - System.currentTimeMillis(), 1000);
                 threads[i].join(wait);
                 if (threads[i].isAlive()) {
                     if (!stacksDumped) {

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RandomOperationTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RandomOperationTest.java?rev=637865&r1=637864&r2=637865&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RandomOperationTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RandomOperationTest.java Mon Mar 17 05:47:35 2008
@@ -24,7 +24,9 @@
 
 /**
  * <code>RandomOperationTest</code> executes randomly chosen operations using
- * multiple threads.
+ * multiple threads. Each thread operates on its own subtree to avoid
+ * conflicting changes.
+ * <p/>
  * Please note that this test is disabled by default!
  * You can enable them by setting {@link #NUM_THREADS} to 1 or higher.
  */
@@ -55,6 +57,11 @@
      */
     private static final int NODES_PER_LEVEL = 3;
 
+    /**
+     * While creating nodes, save whenever 1000 nodes have been created.
+     */
+    private static final int SAVE_INTERVAL = 1000;
+
     private long end;
 
     protected void setUp() throws Exception {
@@ -63,46 +70,56 @@
     }
 
     public void testRandomContentOperations() throws RepositoryException {
-        runTask(new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end), NUM_THREADS);
+        runTask(new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end), NUM_THREADS);
     }
 
     public void testRandomContentOperationsXA() throws RepositoryException {
-        ContentOperationsTask task = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end);
+        ContentOperationsTask task = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
         task.setUseXA(true);
         runTask(task, NUM_THREADS);
     }
 
     public void testRandomVersionOperations() throws RepositoryException {
-        runTask(new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end), NUM_THREADS);
+        runTask(new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end), NUM_THREADS);
     }
 
     public void testRandomVersionOperationsXA() throws RepositoryException {
-        VersionOperationsTask task = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end);
+        VersionOperationsTask task = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
         task.setUseXA(true);
         runTask(task, NUM_THREADS);
     }
 
     public void testContentAndVersionOperations() throws RepositoryException {
         runTasks(new Task[]{
-            new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end),
-            new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end)
+            new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end),
+            new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end)
         }, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000);
     }
 
     public void testContentAndVersionOperationsXA() throws RepositoryException {
-        ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end);
+        ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
         task1.setUseXA(true);
-        VersionOperationsTask task2 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end);
+        VersionOperationsTask task2 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
         task2.setUseXA(true);
         runTasks(new Task[]{task1, task2}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000);
     }
 
     public void testContentAndVersionOperationsXAMixed() throws RepositoryException {
-        ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end);
-        ContentOperationsTask task2 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end);
+        ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
+        ContentOperationsTask task2 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
+        task2.setUseXA(true);
+        VersionOperationsTask task3 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
+        VersionOperationsTask task4 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
+        task4.setUseXA(true);
+        runTasks(new Task[]{task1, task2, task3, task4}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000);
+    }
+
+    public void testContentAndVersionOperationsXAMixedShortSaveInterval() throws RepositoryException {
+        ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end);
+        ContentOperationsTask task2 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end);
         task2.setUseXA(true);
-        VersionOperationsTask task3 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end);
-        VersionOperationsTask task4 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, end);
+        VersionOperationsTask task3 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end);
+        VersionOperationsTask task4 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end);
         task4.setUseXA(true);
         runTasks(new Task[]{task1, task2, task3, task4}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000);
     }

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/CreateNodes.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/CreateNodes.java?rev=637865&r1=637864&r2=637865&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/CreateNodes.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/CreateNodes.java Mon Mar 17 05:47:35 2008
@@ -38,15 +38,19 @@
 
     private final String[] mixins;
 
+    private final int saveInterval;
+
     public CreateNodes(Session s,
                        String path,
                        int numLevels,
                        int nodesPerLevel,
-                       String[] mixins) {
+                       String[] mixins,
+                       int saveInterval) {
         super(s, path);
         this.numLevels = numLevels;
         this.nodesPerLevel = nodesPerLevel;
         this.mixins = mixins;
+        this.saveInterval = saveInterval;
     }
 
     /**
@@ -64,9 +68,10 @@
         levels--;
         for (int i = 0; i < nodesPerLevel; i++) {
             Node child = n.addNode("node" + i);
+            count++;
             addMixins(child);
             log.info("Create node {}", child.getPath());
-            if (count % 1000 == 0) {
+            if (count % saveInterval == 0) {
                 getSession().save();
                 log.debug("Created " + (count / 1000) + "k nodes");
             }

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/OperationFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/OperationFactory.java?rev=637865&r1=637864&r2=637865&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/OperationFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/operation/OperationFactory.java Mon Mar 17 05:47:35 2008
@@ -175,8 +175,10 @@
     public Operation createNodes(String path,
                                  int numLevels,
                                  int nodesPerLevel,
-                                 String[] mixins) {
-        return new CreateNodes(session, path, numLevels, nodesPerLevel, mixins);
+                                 String[] mixins,
+                                 int saveInterval) {
+        return new CreateNodes(session, path, numLevels,
+                nodesPerLevel, mixins, saveInterval);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/ContentOperationsTask.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/ContentOperationsTask.java?rev=637865&r1=637864&r2=637865&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/ContentOperationsTask.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/ContentOperationsTask.java Mon Mar 17 05:47:35 2008
@@ -26,8 +26,9 @@
  */
 public class ContentOperationsTask extends RandomOperationsTask {
 
-    public ContentOperationsTask(int numLevels, int nodesPerLevel, long end) {
-        super(new String[0], numLevels, nodesPerLevel, end);
+    public ContentOperationsTask(int numLevels, int nodesPerLevel,
+                                 int saveInterval, long end) {
+        super(new String[0], numLevels, nodesPerLevel, saveInterval, end);
     }
 
     protected Operation getRandomOperations(OperationFactory f,

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/RandomOperationsTask.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/RandomOperationsTask.java?rev=637865&r1=637864&r2=637865&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/RandomOperationsTask.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/RandomOperationsTask.java Mon Mar 17 05:47:35 2008
@@ -36,14 +36,18 @@
 
     private final int nodesPerLevel;
 
+    private final int saveInterval;
+
     private final long end;
 
     private boolean useXA = false;
 
-    public RandomOperationsTask(String mixins[], int numLevels, int nodesPerLevel, long end) {
+    public RandomOperationsTask(String mixins[], int numLevels,
+                                int nodesPerLevel, int saveInterval, long end) {
         this.mixins = mixins;
         this.numLevels = numLevels;
         this.nodesPerLevel = nodesPerLevel;
+        this.saveInterval = saveInterval;
         this.end = end;
     }
 
@@ -51,7 +55,8 @@
         try {
             OperationFactory f = new OperationFactory(session);
             // create nodes
-            f.createNodes(test.getPath(), numLevels, nodesPerLevel, mixins).execute();
+            f.createNodes(test.getPath(), numLevels, nodesPerLevel,
+                    mixins, saveInterval).execute();
             // save nodes
             f.save(test.getPath()).execute();
 

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/VersionOperationsTask.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/VersionOperationsTask.java?rev=637865&r1=637864&r2=637865&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/VersionOperationsTask.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/random/task/VersionOperationsTask.java Mon Mar 17 05:47:35 2008
@@ -26,8 +26,10 @@
  */
 public class VersionOperationsTask extends RandomOperationsTask {
 
-    public VersionOperationsTask(int numLevels, int nodesPerLevel, long end) {
-        super(new String[]{"mix:versionable"}, numLevels, nodesPerLevel, end);
+    public VersionOperationsTask(int numLevels, int nodesPerLevel,
+                                 int saveInterval, long end) {
+        super(new String[]{"mix:versionable"}, numLevels, nodesPerLevel,
+                saveInterval, end);
     }
 
     protected Operation getRandomOperations(OperationFactory f,