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 ch...@apache.org on 2016/06/21 06:20:25 UTC
svn commit: r1749437 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCache.java
test/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCacheTest.java
Author: chetanm
Date: Tue Jun 21 06:20:25 2016
New Revision: 1749437
URL: http://svn.apache.org/viewvc?rev=1749437&view=rev
Log:
OAK-4180 - Use another NodeStore as a local cache for a remote Document store
Quick exit in case where request lastRev is ahead of current secondary root lastRev as anything below root would have lastRev < rootLastRev < requested last rev
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCache.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCacheTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCache.java?rev=1749437&r1=1749436&r2=1749437&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCache.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCache.java Tue Jun 21 06:20:25 2016
@@ -94,6 +94,12 @@ class SecondaryStoreCache implements Doc
AbstractDocumentNodeState currentRoot = DelegatingDocumentNodeState.wrap(store.getRoot(), differ);
+ //If the root rev is < lastRev then secondary store is lagging and would
+ //not have the matching result
+ if (lastRev.compareTo(currentRoot.getLastRevision()) > 0){
+ return null;
+ }
+
AbstractDocumentNodeState nodeState = findByMatchingLastRev(currentRoot, path, lastRev);
if (nodeState != null){
headRevMatched.mark();
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCacheTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCacheTest.java?rev=1749437&r1=1749436&r2=1749437&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCacheTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/secondary/SecondaryStoreCacheTest.java Tue Jun 21 06:20:25 2016
@@ -165,6 +165,42 @@ public class SecondaryStoreCacheTest {
}
+ @Test
+ public void readWithSecondaryLagging() throws Exception{
+ PathFilter pathFilter = new PathFilter(of("/a"), empty);
+ SecondaryStoreCache cache = new SecondaryStoreCache(secondary, pathFilter, DEFAULT_DIFFER);
+ SecondaryStoreObserver observer = new SecondaryStoreObserver(secondary, pathFilter, cache,
+ DEFAULT_DIFFER, StatisticsProvider.NOOP);
+
+ NodeBuilder nb = primary.getRoot().builder();
+ create(nb, "/a/b", "/a/c");
+ AbstractDocumentNodeState r0 = merge(nb);
+ AbstractDocumentNodeState a_c_0 = documentState(primary.getRoot(), "/a/c");
+
+ observer.contentChanged(r0, null);
+
+ AbstractDocumentNodeState result = cache.getDocumentNodeState("/a/c", r0.getRootRevision(), a_c_0
+ .getLastRevision());
+ assertTrue(EqualsDiff.equals(a_c_0, result));
+
+ //Make change in some other part of tree i.e. /a/c is unmodified
+ nb = primary.getRoot().builder();
+ create(nb, "/a/e");
+ AbstractDocumentNodeState r1 = merge(nb);
+
+ //Change is yet not pushed to secondary i.e. observer not invoked
+ //but lookup with latest root should still work fine if lastRev matches
+ result = cache.getDocumentNodeState("/a/c", r1.getRootRevision(), a_c_0
+ .getLastRevision());
+ assertTrue(EqualsDiff.equals(a_c_0, result));
+
+ //Change which is not pushed would though not be visible
+ AbstractDocumentNodeState a_e_1 = documentState(primary.getRoot(), "/a/e");
+ result = cache.getDocumentNodeState("/a/e", r1.getRootRevision(), a_e_1
+ .getLastRevision());
+ assertNull(result);
+ }
+
private SecondaryStoreCache createCache(PathFilter pathFilter){
SecondaryStoreCache cache = new SecondaryStoreCache(secondary, pathFilter, DEFAULT_DIFFER);
SecondaryStoreObserver observer = new SecondaryStoreObserver(secondary, pathFilter, cache,