Author: tomekr
Date: Mon Nov 20 11:32:57 2017
New Revision: 1815792

URL: http://svn.apache.org/viewvc?rev=1815792&view=rev
Log:
OAK-6347: Don't track local changes in the document cache tracker

Modified:
    
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
    
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java

Modified: 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java?rev=1815792&r1=1815791&r2=1815792&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
 Mon Nov 20 11:32:57 2017
@@ -444,11 +444,11 @@ public class NodeDocumentCache implement
                 NodeDocument cachedDoc = getIfPresent(id);
                 // if an old document is present in the cache, we can simply 
update it
                 if (cachedDoc != null && isNewer(cachedDoc, d)) {
-                    putInternal(d);
+                    putInternal(d, tracker);
                 // if the document hasn't been invalidated or added during the 
tracker lifetime,
                 // we can put it as well
                 } else if (cachedDoc == null && 
!tracker.mightBeenAffected(id)) {
-                    putInternal(d);
+                    putInternal(d, tracker);
                 }
             } finally {
                 lock.unlock();
@@ -470,17 +470,33 @@ public class NodeDocumentCache implement
     }
 
     /**
-     * Puts a document into the cache without acquiring a lock.
+     * Puts a document into the cache without acquiring a lock. All trackers 
will
+     * be updated.
      *
      * @param doc the document to put into the cache.
      */
     protected final void putInternal(@Nonnull NodeDocument doc) {
+        putInternal(doc, null);
+    }
+
+    /**
+     * Puts a document into the cache without acquiring a lock. All trackers 
will
+     * be updated, apart from the {@code trackerToSkip}.
+     *
+     * @param doc the document to put into the cache.
+     * @param trackerToSkip this tracker won't be updated. pass {@code null} 
to update
+     *                      all trackers.
+     */
+    protected final void putInternal(@Nonnull NodeDocument doc, @Nullable 
CacheChangesTracker trackerToSkip) {
         if (isLeafPreviousDocId(doc.getId())) {
             prevDocumentsCache.put(new StringValue(doc.getId()), doc);
         } else {
             nodeDocumentsCache.put(new StringValue(doc.getId()), doc);
         }
         for (CacheChangesTracker tracker : changeTrackers) {
+            if (tracker == trackerToSkip) {
+                continue;
+            }
             tracker.putDocument(doc.getId());
         }
     }

Modified: 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java?rev=1815792&r1=1815791&r2=1815792&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java
 Mon Nov 20 11:32:57 2017
@@ -29,7 +29,6 @@ import org.apache.jackrabbit.oak.plugins
 import 
org.apache.jackrabbit.oak.plugins.document.locks.StripedNodeDocumentLocks;
 import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
 import org.apache.jackrabbit.oak.plugins.document.util.StringValue;
-import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -147,6 +146,19 @@ public class CacheChangesTrackerTest {
         assertFalse(tracker.mightBeenAffected("1:/aaa"));
     }
 
+
+    @Test
+    public void testOnlyExternalChanges() {
+        NodeDocumentCache cache = createCache();
+        CacheChangesTracker tracker = 
cache.registerTracker(getKeyLowerLimit("/parent"), getKeyUpperLimit("/parent"));
+
+        cache.putNonConflictingDocs(tracker, 
ImmutableSet.of(createDoc("2:/parent/local")));
+        assertFalse(tracker.mightBeenAffected("2:/parent/local"));
+
+        cache.put(createDoc("2:/parent/external"));
+        assertTrue(tracker.mightBeenAffected("2:/parent/external"));
+    }
+
     private NodeDocumentCache createCache() {
         Cache<CacheValue, NodeDocument> nodeDocumentsCache = new 
CacheLIRS<CacheValue, NodeDocument>(10);
         Cache<StringValue, NodeDocument> prevDocumentsCache = new 
CacheLIRS<StringValue, NodeDocument>(10);


Reply via email to