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);