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 mr...@apache.org on 2020/09/22 14:13:45 UTC

svn commit: r1881932 - in /jackrabbit/oak/branches/1.8: ./ oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/ oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/

Author: mreutegg
Date: Tue Sep 22 14:13:45 2020
New Revision: 1881932

URL: http://svn.apache.org/viewvc?rev=1881932&view=rev
Log:
OAK-7553: Extract interface from CommitValueResolver

Merge revision 1833787 from trunk

Added:
    jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java
      - copied, changed from r1833787, jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java
Modified:
    jackrabbit/oak/branches/1.8/   (props changed)
    jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolver.java
    jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
    jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolverTest.java

Propchange: jackrabbit/oak/branches/1.8/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1833787

Copied: jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java (from r1833787, jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java?p2=jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java&p1=jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java&r1=1833787&r2=1881932&rev=1881932&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java (original)
+++ jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CachingCommitValueResolver.java Tue Sep 22 14:13:45 2020
@@ -18,13 +18,12 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.util.List;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
-
 import com.google.common.base.Supplier;
 import com.google.common.cache.Cache;
 
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import static com.google.common.cache.CacheBuilder.newBuilder;
 import static com.google.common.collect.ImmutableList.of;
@@ -47,8 +46,8 @@ final class CachingCommitValueResolver i
     }
 
     @Override
-    public String resolve(@Nonnull Revision changeRevision,
-                          @Nonnull NodeDocument doc) {
+    public String resolve(@NotNull Revision changeRevision,
+                          @NotNull NodeDocument doc) {
         // check cache first
         String value = commitValueCache.getIfPresent(changeRevision);
         if (value != null) {
@@ -126,9 +125,9 @@ final class CachingCommitValueResolver i
      * @return the document with the change or {@code null} if there is no
      *      document with such a change.
      */
-    @CheckForNull
-    private NodeDocument resolveDocument(@Nonnull NodeDocument doc,
-                                         @Nonnull Revision changeRevision) {
+    @Nullable
+    private NodeDocument resolveDocument(@NotNull NodeDocument doc,
+                                         @NotNull Revision changeRevision) {
         // check if the document contains the change or we need to
         // look up previous documents for the actual change
         if (doc.getLocalCommitRoot().containsKey(changeRevision)

Modified: jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolver.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolver.java?rev=1881932&r1=1881931&r2=1881932&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolver.java (original)
+++ jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolver.java Tue Sep 22 14:13:45 2020
@@ -16,136 +16,20 @@
  */
 package org.apache.jackrabbit.oak.plugins.document;
 
-import java.util.List;
-
-import com.google.common.base.Supplier;
-import com.google.common.cache.Cache;
-
-import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import static com.google.common.cache.CacheBuilder.newBuilder;
-import static com.google.common.collect.ImmutableList.of;
 
 /**
  * Resolves the commit value for a given change revision on a document.
  */
-final class CommitValueResolver {
-
-    private static final List<String> COMMIT_ROOT_OR_REVISIONS
-            = of(NodeDocument.COMMIT_ROOT, NodeDocument.REVISIONS);
-
-    private final Cache<Revision, String> commitValueCache;
-
-    private final Supplier<RevisionVector> sweepRevisions;
-
-    CommitValueResolver(int cacheSize, Supplier<RevisionVector> sweepRevisions) {
-        this.commitValueCache = newBuilder().maximumSize(cacheSize).build();
-        this.sweepRevisions = sweepRevisions;
-    }
-
-    String resolve(@NotNull Revision changeRevision,
-                   @NotNull NodeDocument doc) {
-        // check cache first
-        String value = commitValueCache.getIfPresent(changeRevision);
-        if (value != null) {
-            return value;
-        }
-        // need to determine the commit value
-        doc = resolveDocument(doc, changeRevision);
-        if (doc == null) {
-            // the document including its history does not contain a change
-            // for the given revision
-            return null;
-        }
-        // at this point 'doc' is guaranteed to have a local entry
-        // for the given change revision
-        if (sweepRevisions.get().isRevisionNewer(changeRevision)) {
-            // change revision is newer than sweep revision
-            // resolve the commit value without any short cuts
-            value = doc.resolveCommitValue(changeRevision);
-        } else {
-            // change revision is equal or older than sweep revision
-            // there are different cases:
-            // - doc is a main document and we have a guarantee that a
-            //   potential branch commit is marked accordingly
-            // - doc is a split document and the revision is guaranteed
-            //   to be committed. the remaining question is whether the
-            //   revision is from a branch commit
-            NodeDocument.SplitDocType sdt = doc.getSplitDocType();
-            if (sdt == NodeDocument.SplitDocType.NONE) {
-                // sweeper ensures that all changes on main document
-                // before the sweep revision are properly marked with
-                // branch commit entry if applicable
-                if (doc.getLocalBranchCommits().contains(changeRevision)) {
-                    // resolve the commit value the classic way
-                    value = doc.resolveCommitValue(changeRevision);
-                } else {
-                    value = "c";
-                }
-            } else if (sdt == NodeDocument.SplitDocType.DEFAULT_NO_BRANCH) {
-                // split document without branch commits, we don't have
-                // to check the commit root, the commit value is always 'c'
-                value = "c";
-            } else {
-                // some other split document type introduced
-                // before Oak 1.8 and we don't know if this is a branch
-                // commit. first try to resolve
-                value = doc.resolveCommitValue(changeRevision);
-                if (value == null) {
-                    // then it must be a non-branch commit and the
-                    // split document with the commit value was
-                    // already garbage collected
-                    value = "c";
-                }
-            }
-        }
-        if (Utils.isCommitted(value)) {
-            // only cache committed states
-            // e.g. branch commits may be merged later and
-            // the commit value will change
-            commitValueCache.put(changeRevision, value);
-        }
-        return value;
-    }
+public interface CommitValueResolver {
 
     /**
-     * Resolves to the document that contains the change with the given
-     * revision. If the given document contains a local change for the given
-     * revision, then the passed document is returned. Otherwise this method
-     * looks up previous documents and returns one with a change for the given
-     * revision. This method returns {@code null} if neither the passed document
-     * nor any of its previous documents contains a change for the given
-     * revision.
+     * Resolve a change revision on the given document and return the commit
+     * value for the change revision.
      *
-     * @param doc the document to resolve for the given change revision.
-     * @param changeRevision the revision of a change.
-     * @return the document with the change or {@code null} if there is no
-     *      document with such a change.
+     * @param changeRevision the revision for a change.
+     * @param doc the document with the change.
+     * @return the commit value of the revision.
      */
-    @Nullable
-    private NodeDocument resolveDocument(@NotNull NodeDocument doc,
-                                         @NotNull Revision changeRevision) {
-        // check if the document contains the change or we need to
-        // look up previous documents for the actual change
-        if (doc.getLocalCommitRoot().containsKey(changeRevision)
-                || doc.getLocalRevisions().containsKey(changeRevision)) {
-            return doc;
-        }
-        // find the previous document with this change
-        // first check if there is a commit root entry for this revision
-        NodeDocument d = null;
-        for (String p : COMMIT_ROOT_OR_REVISIONS) {
-            for (NodeDocument prev : doc.getPreviousDocs(p, changeRevision)) {
-                d = prev;
-                break;
-            }
-            if (d != null) {
-                break;
-            }
-        }
-        return d;
-    }
-
+    String resolve(@NotNull Revision changeRevision, @NotNull NodeDocument doc);
 }

Modified: jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java?rev=1881932&r1=1881931&r2=1881932&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java (original)
+++ jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStore.java Tue Sep 22 14:13:45 2020
@@ -526,13 +526,8 @@ public final class DocumentNodeStore
     public DocumentNodeStore(DocumentNodeStoreBuilder<?> builder) {
         this.nodeCachePredicate = builder.getNodeCachePredicate();
         this.updateLimit = builder.getUpdateLimit();
-        this.commitValueResolver = new CommitValueResolver(builder.getCommitValueCacheSize(),
-                new Supplier<RevisionVector>() {
-            @Override
-            public RevisionVector get() {
-                return getSweepRevisions();
-            }
-        });
+        this.commitValueResolver = new CachingCommitValueResolver(
+                builder.getCommitValueCacheSize(), this::getSweepRevisions);
         this.blobStore = builder.getBlobStore();
         this.nodeStoreStatsCollector = builder.getNodeStoreStatsCollector();
         if (builder.isUseSimpleRevision()) {

Modified: jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolverTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolverTest.java?rev=1881932&r1=1881931&r2=1881932&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolverTest.java (original)
+++ jackrabbit/oak/branches/1.8/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CommitValueResolverTest.java Tue Sep 22 14:13:45 2020
@@ -45,7 +45,7 @@ public class CommitValueResolverTest {
     @Before
     public void setup() {
         ns = builderProvider.newBuilder().setUpdateLimit(20).setAsyncDelay(0).getNodeStore();
-        resolver = new CommitValueResolver(0, new Supplier<RevisionVector>() {
+        resolver = new CachingCommitValueResolver(0, new Supplier<RevisionVector>() {
             @Override
             public RevisionVector get() {
                 return ns.getSweepRevisions();