diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java index 89dfd96..f4efc6e 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java @@ -444,11 +444,11 @@ public class NodeDocumentCache implements Closeable { 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 implements Closeable { } /** - * 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()); } } diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java index 56202c8..cab7383 100644 --- a/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java +++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/cache/CacheChangesTrackerTest.java @@ -29,7 +29,6 @@ import org.apache.jackrabbit.oak.plugins.document.locks.NodeDocumentLocks; 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 nodeDocumentsCache = new CacheLIRS(10); Cache prevDocumentsCache = new CacheLIRS(10);