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