You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2015/09/10 14:04:29 UTC

svn commit: r1702226 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/

Author: mreutegg
Date: Thu Sep 10 12:04:29 2015
New Revision: 1702226

URL: http://svn.apache.org/r1702226
Log:
OAK-3386: ConcurrentAddNodesClusterIT.addNodesConcurrent() blocks occasionally

Introduce suspend timeout and enable test

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitQueue.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitQueueTest.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ConcurrentAddNodesClusterIT.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitQueue.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitQueue.java?rev=1702226&r1=1702225&r2=1702226&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitQueue.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitQueue.java Thu Sep 10 12:04:29 2015
@@ -45,6 +45,11 @@ final class CommitQueue {
 
     static final Logger LOG = LoggerFactory.getLogger(CommitQueue.class);
 
+    /**
+     * The default suspend timeout in milliseconds: 60'000.
+     */
+    static final long DEFAULT_SUSPEND_TIMEOUT = TimeUnit.MINUTES.toMillis(1);
+
     private final SortedMap<Revision, Entry> commits = new TreeMap<Revision, Entry>(StableRevisionComparator.INSTANCE);
 
     /**
@@ -54,6 +59,8 @@ final class CommitQueue {
 
     private final RevisionContext context;
 
+    private long suspendTimeout = Long.getLong("oak.documentMK.suspendTimeoutMillis", DEFAULT_SUSPEND_TIMEOUT);
+
     CommitQueue(@Nonnull RevisionContext context) {
         this.context = checkNotNull(context);
     }
@@ -96,8 +103,13 @@ final class CommitQueue {
     }
 
     /**
-     * Suspends until the given revision is visible from the current
-     * headRevision or the given revision is canceled from the commit queue.
+     * Suspends until one of the following happens:
+     * <ul>
+     *     <li>the given revision is visible from the current headRevision</li>
+     *     <li>the given revision is canceled from the commit queue</li>
+     *     <li>the suspend timeout is reached. See {@link #setSuspendTimeoutMillis(long)}</li>
+     *     <li>the thread is interrupted</li>
+     * </ul>
      *
      * @param r the revision to become visible.
      */
@@ -112,7 +124,13 @@ final class CommitQueue {
             }
         }
         if (s != null) {
-            s.acquireUninterruptibly();
+            try {
+                s.tryAcquire(suspendTimeout, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                synchronized (suspendedCommits) {
+                    suspendedCommits.remove(s);
+                }
+            }
         }
     }
 
@@ -133,6 +151,16 @@ final class CommitQueue {
         }
     }
 
+    /**
+     * Sets the suspend timeout in milliseconds.
+     * See also {@link #suspendUntil(Revision)}.
+     *
+     * @param timeout the timeout to set.
+     */
+    void setSuspendTimeoutMillis(long timeout) {
+        this.suspendTimeout = timeout;
+    }
+
     interface Callback {
 
         void headOfQueue(@Nonnull Revision revision);

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitQueueTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitQueueTest.java?rev=1702226&r1=1702225&r2=1702226&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitQueueTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitQueueTest.java Thu Sep 10 12:04:29 2015
@@ -246,6 +246,33 @@ public class CommitQueueTest {
         assertEquals(0, queue.numSuspendedThreads());
     }
 
+    @Test
+    public void suspendUntilTimeout() throws Exception {
+        final AtomicReference<Revision> headRevision = new AtomicReference<Revision>();
+        RevisionContext context = new DummyRevisionContext() {
+            @Nonnull
+            @Override
+            public Revision getHeadRevision() {
+                return headRevision.get();
+            }
+        };
+        headRevision.set(context.newRevision());
+        final CommitQueue queue = new CommitQueue(context);
+        queue.setSuspendTimeoutMillis(0);
+
+        final Revision r = context.newRevision();
+        Thread t = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                queue.suspendUntil(r);
+            }
+        });
+        t.start();
+
+        t.join(1000);
+        assertFalse(t.isAlive());
+    }
+
     private void assertNoExceptions() throws Exception {
         if (!exceptions.isEmpty()) {
             throw exceptions.get(0);

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ConcurrentAddNodesClusterIT.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ConcurrentAddNodesClusterIT.java?rev=1702226&r1=1702225&r2=1702226&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ConcurrentAddNodesClusterIT.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/ConcurrentAddNodesClusterIT.java Thu Sep 10 12:04:29 2015
@@ -89,7 +89,6 @@ public class ConcurrentAddNodesClusterIT
         dropDB();
     }
 
-    @Ignore("OAK-3386")
     @Test
     public void addNodesConcurrent() throws Exception {
         for (int i = 0; i < NUM_CLUSTER_NODES; i++) {