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++) {