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);
+ }
}