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,