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,