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,


Reply via email to