Author: mreutegg Date: Thu Oct 29 13:26:56 2015 New Revision: 1711248 URL: http://svn.apache.org/viewvc?rev=1711248&view=rev Log: OAK-3567: Long running query holds TreeLock
Adjust test to check if withLock parameter is respected Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java?rev=1711248&r1=1711247&r2=1711248&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java Thu Oct 29 13:26:56 2015 @@ -31,6 +31,7 @@ import java.util.TreeMap; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -139,6 +140,11 @@ public class MongoDocumentStore implemen private final Striped<ReadWriteLock> parentLocks = Striped.readWriteLock(64); /** + * Counts how many times {@link TreeLock}s were acquired. + */ + private final AtomicLong lockAcquisitionCounter = new AtomicLong(); + + /** * Comparator for maps with {@link Revision} keys. The maps are ordered * descending, newest revisions first! */ @@ -1371,6 +1377,7 @@ public class MongoDocumentStore implemen * @return the acquired lock for the given key. */ private TreeLock acquire(String key, Collection<?> collection) { + lockAcquisitionCounter.incrementAndGet(); if (collection == Collection.NODES) { return TreeLock.shared(parentLocks.get(getParentId(key)), locks.get(key)); } else { @@ -1387,6 +1394,7 @@ public class MongoDocumentStore implemen * @return the acquired lock for the given parent key. */ private TreeLock acquireExclusive(String parentKey) { + lockAcquisitionCounter.incrementAndGet(); return TreeLock.exclusive(parentLocks.get(parentKey)); } @@ -1431,6 +1439,10 @@ public class MongoDocumentStore implemen this.maxLockedQueryTimeMS = maxLockedQueryTimeMS; } + long getLockAcquisitionCount() { + return lockAcquisitionCounter.get(); + } + private final static class TreeLock { private final Lock parentLock; Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java?rev=1711248&r1=1711247&r2=1711248&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTest.java Thu Oct 29 13:26:56 2015 @@ -32,6 +32,7 @@ import org.apache.jackrabbit.oak.plugins import org.apache.jackrabbit.oak.plugins.document.util.Utils; import org.junit.Test; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -66,10 +67,12 @@ public class MongoDocumentStoreTest exte } mk.commit("/", sb.toString(), null, null); store.queriesWithoutLock.set(0); + long lockCount = store.getLockAcquisitionCount(); List<NodeDocument> docs = store.query(Collection.NODES, fromId, toId, "foo", System.currentTimeMillis(), Integer.MAX_VALUE); assertTrue(docs.isEmpty()); if (store.queriesWithoutLock.get() > 0) { + assertEquals(lockCount + 1, store.getLockAcquisitionCount()); return; } }