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 to...@apache.org on 2016/04/28 16:22:04 UTC
svn commit: r1741430 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/document/cache/
main/java/org/apache/jackrabbit/oak/plugins/document/locks/
main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ test/java/...
Author: tomekr
Date: Thu Apr 28 14:22:03 2016
New Revision: 1741430
URL: http://svn.apache.org/viewvc?rev=1741430&view=rev
Log:
OAK-4168 Replace the massive lock acquire with cache tracker in bulk createOrUpdate()
Removed:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/BulkLock.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/locks/NodeDocumentLocksTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/NodeDocumentLocks.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/StripedNodeDocumentLocks.java
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/cache/CacheChangesTrackerTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java?rev=1741430&r1=1741429&r2=1741430&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java Thu Apr 28 14:22:03 2016
@@ -21,6 +21,7 @@ import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutionException;
@@ -372,7 +373,23 @@ public class NodeDocumentCache implement
}, changeTrackers, bloomFilterSize);
}
- /**
+ /**
+ * Registers a new CacheChangesTracker that records all puts and
+ * invalidations related to the given documents
+ *
+ * @param keys these documents will be tracked
+ * @return new tracker
+ */
+ public CacheChangesTracker registerTracker(final Set<String> keys) {
+ return new CacheChangesTracker(new Predicate<String>() {
+ @Override
+ public boolean apply(@Nullable String input) {
+ return input != null && keys.contains(input);
+ }
+ }, changeTrackers, CacheChangesTracker.ENTRIES_SCOPED);
+ }
+
+ /**
* Updates the cache with all the documents that:
*
* (1) currently have their older versions in the cache or
@@ -391,7 +408,7 @@ public class NodeDocumentCache implement
* @param docs
* to put into cache
*/
- public void putNonConflictingDocs(CacheChangesTracker tracker, List<NodeDocument> docs) {
+ public void putNonConflictingDocs(CacheChangesTracker tracker, Iterable<NodeDocument> docs) {
for (NodeDocument d : docs) {
if (d == null || d == NodeDocument.NULL) {
continue;
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/NodeDocumentLocks.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/NodeDocumentLocks.java?rev=1741430&r1=1741429&r2=1741430&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/NodeDocumentLocks.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/NodeDocumentLocks.java Thu Apr 28 14:22:03 2016
@@ -16,7 +16,6 @@
*/
package org.apache.jackrabbit.oak.plugins.document.locks;
-import java.util.Collection;
import java.util.concurrent.locks.Lock;
public interface NodeDocumentLocks {
@@ -29,12 +28,4 @@ public interface NodeDocumentLocks {
*/
Lock acquire(String key);
- /**
- * Acquires locks for the given keys. Locks are sorted before the operation
- * to avoid deadlocks.
- *
- * @param keys keys
- * @return the object wrapping the acquired locks
- */
- Lock acquire(Collection<String> keys);
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/StripedNodeDocumentLocks.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/StripedNodeDocumentLocks.java?rev=1741430&r1=1741429&r2=1741430&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/StripedNodeDocumentLocks.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/locks/StripedNodeDocumentLocks.java Thu Apr 28 14:22:03 2016
@@ -16,13 +16,6 @@
*/
package org.apache.jackrabbit.oak.plugins.document.locks;
-import static com.google.common.base.Predicates.equalTo;
-import static com.google.common.base.Predicates.not;
-import static com.google.common.collect.Iterables.filter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
import java.util.concurrent.locks.Lock;
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
@@ -46,17 +39,4 @@ public class StripedNodeDocumentLocks im
return lock;
}
- @Override
- public Lock acquire(Collection<String> keys) {
- List<Lock> lockList = new ArrayList<Lock>();
- if (keys.contains(ROOT)) {
- lockList.add(rootLock);
- }
- for (Lock l : locks.bulkGet(filter(keys, not(equalTo(ROOT))))) {
- lockList.add(l);
- }
- Lock lock = new BulkLock(lockList);
- lock.lock();
- return lock;
- }
}
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=1741430&r1=1741429&r2=1741430&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 Apr 28 14:22:03 2016
@@ -907,29 +907,30 @@ public class MongoDocumentStore implemen
Set<String> lackingDocs = difference(bulkOperations.keySet(), oldDocs.keySet());
oldDocs.putAll(findDocuments(collection, lackingDocs));
- Lock lock = null;
+ CacheChangesTracker tracker = null;
if (collection == Collection.NODES) {
- lock = nodeLocks.acquire(bulkOperations.keySet());
+ tracker = nodesCache.registerTracker(bulkOperations.keySet());
}
try {
BulkUpdateResult bulkResult = sendBulkUpdate(collection, bulkOperations.values(), oldDocs);
if (collection == Collection.NODES) {
+ List<NodeDocument> docsToCache = new ArrayList<NodeDocument>();
for (UpdateOp op : filterKeys(bulkOperations, in(bulkResult.upserts)).values()) {
NodeDocument doc = Collection.NODES.newDocument(this);
UpdateUtils.applyChanges(doc, op);
- nodesCache.put(doc);
+ docsToCache.add(doc);
}
for (String key : difference(bulkOperations.keySet(), bulkResult.failedUpdates)) {
T oldDoc = oldDocs.get(key);
if (oldDoc != null) {
NodeDocument newDoc = (NodeDocument) applyChanges(collection, oldDoc, bulkOperations.get(key));
- nodesCache.put(newDoc);
- oldDoc.seal();
+ docsToCache.add(newDoc);
}
}
+ nodesCache.putNonConflictingDocs(tracker, docsToCache);
}
oldDocs.keySet().removeAll(bulkResult.failedUpdates);
@@ -945,8 +946,8 @@ public class MongoDocumentStore implemen
}
return result;
} finally {
- if (lock != null) {
- lock.unlock();
+ if (tracker != null) {
+ tracker.close();
}
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java?rev=1741430&r1=1741429&r2=1741430&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java Thu Apr 28 14:22:03 2016
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugin
import com.google.common.base.Predicate;
import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableSet;
import org.apache.jackrabbit.oak.cache.CacheLIRS;
import org.apache.jackrabbit.oak.cache.CacheStats;
import org.apache.jackrabbit.oak.cache.CacheValue;
@@ -122,6 +123,30 @@ public class CacheChangesTrackerTest {
assertTrue(tracker.mightBeenAffected("2:/parent/xyz"));
}
+ @Test
+ public void testRegisterKeysTracker() {
+ NodeDocumentCache cache = createCache();
+ CacheChangesTracker tracker = cache.registerTracker(ImmutableSet.of("1:/xyz", "1:/abc", "1:/aaa"));
+
+ assertFalse(tracker.mightBeenAffected("1:/xyz"));
+ assertFalse(tracker.mightBeenAffected("1:/abc"));
+ assertFalse(tracker.mightBeenAffected("1:/aaa"));
+
+ cache.put(createDoc("1:/xyz"));
+ assertTrue(tracker.mightBeenAffected("1:/xyz"));
+
+ cache.invalidate("1:/abc");
+ assertTrue(tracker.mightBeenAffected("1:/abc"));
+
+ cache.invalidate("1:/other");
+ assertFalse(tracker.mightBeenAffected("1:/other"));
+
+ tracker.close();
+
+ cache.invalidate("1:/aaa");
+ assertFalse(tracker.mightBeenAffected("1:/aaa"));
+ }
+
private NodeDocumentCache createCache() {
Cache<CacheValue, NodeDocument> nodeDocumentsCache = new CacheLIRS<CacheValue, NodeDocument>(10);
Cache<StringValue, NodeDocument> prevDocumentsCache = new CacheLIRS<StringValue, NodeDocument>(10);