Author: mreutegg
Date: Wed Feb 22 15:41:52 2017
New Revision: 1784032

URL: http://svn.apache.org/viewvc?rev=1784032&view=rev
Log:
OAK-5761: Move commit value resolution to DocumentNodeStore

Introduce RevisionContext.getCommitValue() with an implementation in 
DocumentNodeStore

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionContext.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DummyRevisionContext.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java?rev=1784032&r1=1784031&r2=1784032&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
 Wed Feb 22 15:41:52 2017
@@ -82,6 +82,7 @@ import com.google.common.util.concurrent
 
 import org.apache.jackrabbit.api.stats.TimeSeries;
 import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.cache.CacheLIRS;
 import org.apache.jackrabbit.oak.commons.IOUtils;
 import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean;
 import org.apache.jackrabbit.oak.core.SimpleCommitContext;
@@ -364,6 +365,12 @@ public final class DocumentNodeStore
     private final DiffCache diffCache;
 
     /**
+     * A fixed size cache for commit values.
+     */
+    private final Cache<Revision, String> commitValueCache
+            = new CacheLIRS<Revision, String>(10000);
+
+    /**
      * The blob store.
      */
     private final BlobStore blobStore;
@@ -1830,6 +1837,20 @@ public final class DocumentNodeStore
         return Revision.newRevision(clusterId);
     }
 
+    @Override
+    public String getCommitValue(@Nonnull Revision changeRevision,
+                                 @Nonnull NodeDocument doc) {
+        String value = commitValueCache.getIfPresent(changeRevision);
+        if (value != null) {
+            return value;
+        }
+        value = doc.resolveCommitValue(changeRevision);
+        if (Utils.isCommitted(value)) {
+            commitValueCache.put(changeRevision, value);
+        }
+        return value;
+    }
+
     //----------------------< background operations 
>---------------------------
 
     /** Used for testing only */

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java?rev=1784032&r1=1784031&r2=1784032&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
 Wed Feb 22 15:41:52 2017
@@ -948,7 +948,7 @@ public final class NodeDocument extends
         Map<Revision, String> validRevisions = Maps.newHashMap();
         Branch branch = nodeStore.getBranches().getBranch(readRevision);
         LastRevs lastRevs = createLastRevs(readRevision,
-                validRevisions, branch, lastModified);
+                nodeStore, branch, lastModified);
 
         Revision min = getLiveRevision(nodeStore, readRevision, 
validRevisions, lastRevs);
         if (min == null) {
@@ -1720,6 +1720,15 @@ public final class NodeDocument extends
         return getLocalMap(STALE_PREV);
     }
 
+    @CheckForNull
+    String resolveCommitValue(Revision revision) {
+        NodeDocument commitRoot = getCommitRoot(revision);
+        if (commitRoot == null) {
+            return null;
+        }
+        return commitRoot.getCommitValue(revision);
+    }
+
     //-------------------------< UpdateOp modifiers 
>---------------------------
 
     public static void setChildrenFlag(@Nonnull UpdateOp op,
@@ -1884,7 +1893,7 @@ public final class NodeDocument extends
     }
 
     private LastRevs createLastRevs(@Nonnull RevisionVector readRevision,
-                                    @Nonnull Map<Revision, String> 
validRevisions,
+                                    @Nonnull RevisionContext context,
                                     @Nullable Branch branch,
                                     @Nullable Revision pendingLastRev) {
         LastRevs lastRevs = new LastRevs(getLastRev(), readRevision, branch);
@@ -1906,10 +1915,7 @@ public final class NodeDocument extends
                 // already found most recent change from this cluster node
                 continue;
             }
-            String commitValue = validRevisions.get(r);
-            if (commitValue == null) {
-                commitValue = resolveCommitValue(r);
-            }
+            String commitValue = context.getCommitValue(r, this);
             if (commitValue == null) {
                 continue;
             }
@@ -1929,14 +1935,6 @@ public final class NodeDocument extends
         return lastRevs;
     }
 
-    private String resolveCommitValue(Revision revision) {
-        NodeDocument commitRoot = getCommitRoot(revision);
-        if (commitRoot == null) {
-            return null;
-        }
-        return commitRoot.getCommitValue(revision);
-    }
-
     /**
      * Returns {@code true} if the given {@code revision} is more recent or
      * equal to the committed revision in {@code valueMap}. This method assumes
@@ -2168,7 +2166,7 @@ public final class NodeDocument extends
             Revision propRev = entry.getKey();
             String commitValue = validRevisions.get(propRev);
             if (commitValue == null) {
-                commitValue = resolveCommitValue(propRev);
+                commitValue = context.getCommitValue(propRev, this);
             }
             if (commitValue == null) {
                 continue;

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionContext.java?rev=1784032&r1=1784031&r2=1784032&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionContext.java
 Wed Feb 22 15:41:52 2017
@@ -16,8 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.document;
 
-import java.util.Comparator;
-
+import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 /**
@@ -52,4 +51,26 @@ public interface RevisionContext {
      */
     @Nonnull
     Revision newRevision();
+
+    /**
+     * Retrieves the commit value for a given change. This method returns the
+     * following types of commit values:
+     * <ul>
+     *     <li>"c" : the change revision is committed as is.</li>
+     *     <li>"c-rX-Y-Z" : the change revision is a branch commit merged in
+     *          revision "rX-Y-Z".</li>
+     *     <li>"brX-Y-Z" : the change revision is a branch commit done at
+     *          "rX-Y-Z" but not yet merged.</li>
+     *     <li>{@code null} : the change revision does not have an entry on
+     *          the commit root document and is not committed.</li>
+     * </ul>
+     *
+     * @param changeRevision the revision a change was made.
+     * @param doc the document where the change was made.
+     * @return the commit value or {@code null} if the change does not
+     *          have a commit value (yet).
+     */
+    @CheckForNull
+    String getCommitValue(@Nonnull Revision changeRevision,
+                          @Nonnull NodeDocument doc);
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java?rev=1784032&r1=1784031&r2=1784032&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentSplitTest.java
 Wed Feb 22 15:41:52 2017
@@ -1037,6 +1037,12 @@ public class DocumentSplitTest extends B
         public Revision newRevision() {
             return rc.newRevision();
         }
+
+        @Override
+        public String getCommitValue(@Nonnull Revision changeRevision,
+                                     @Nonnull NodeDocument doc) {
+            return rc.getCommitValue(changeRevision, doc);
+        }
     }
 
     private static NodeState merge(NodeStore store, NodeBuilder root)

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DummyRevisionContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DummyRevisionContext.java?rev=1784032&r1=1784031&r2=1784032&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DummyRevisionContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DummyRevisionContext.java
 Wed Feb 22 15:41:52 2017
@@ -51,4 +51,10 @@ public class DummyRevisionContext implem
     public Revision newRevision() {
         return Revision.newRevision(getClusterId());
     }
+
+    @Override
+    public String getCommitValue(@Nonnull Revision changeRevision,
+                                 @Nonnull NodeDocument doc) {
+        return doc.resolveCommitValue(changeRevision);
+    }
 }


Reply via email to