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 ch...@apache.org on 2014/07/30 12:03:30 UTC

svn commit: r1614600 - in /jackrabbit/oak/branches/1.0: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/ oak-doc/

Author: chetanm
Date: Wed Jul 30 10:03:29 2014
New Revision: 1614600

URL: http://svn.apache.org/r1614600
Log:
OAK-1926 - UnmergedBranch state growing with empty BranchCommit leading to performance degradation

merging 1612825


Added:
    jackrabbit/oak/branches/1.0/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/UnmergedBranchTest.java
      - copied unchanged from r1612825, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/UnmergedBranchTest.java
Modified:
    jackrabbit/oak/branches/1.0/   (props changed)
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
    jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnmergedBranches.java
    jackrabbit/oak/branches/1.0/oak-doc/   (props changed)

Propchange: jackrabbit/oak/branches/1.0/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1612825

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java?rev=1614600&r1=1614599&r2=1614600&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java Wed Jul 30 10:03:29 2014
@@ -542,30 +542,40 @@ public final class NodeDocument extends 
     }
 
     /**
-     * Gets a sorted map of uncommitted revisions of this document with the
+     * Purge the  uncommitted revisions of this document with the
      * local cluster node id as returned by the {@link RevisionContext}. These
      * are the {@link #REVISIONS} entries where {@link Utils#isCommitted(String)}
      * returns false.
      *
+     * <p>
+     *     <bold>Note</bold> - This method should only be invoked upon startup
+     *     as then only we can safely assume that these revisions would not be
+     *     committed
+     * </p>
+     *
      * @param context the revision context.
-     * @return the uncommitted revisions of this document.
+     * @return count of the revision entries purged
      */
-    public SortedMap<Revision, Revision> getUncommittedRevisions(RevisionContext context) {
+    public int purgeUncommittedRevisions(RevisionContext context) {
         // only look at revisions in this document.
         // uncommitted revisions are not split off
         Map<Revision, String> valueMap = getLocalRevisions();
-        SortedMap<Revision, Revision> revisions =
-                new TreeMap<Revision, Revision>(context.getRevisionComparator());
+        UpdateOp op = new UpdateOp(getId(), false);
+        int purgeCount = 0;
         for (Map.Entry<Revision, String> commit : valueMap.entrySet()) {
             if (!Utils.isCommitted(commit.getValue())) {
                 Revision r = commit.getKey();
                 if (r.getClusterId() == context.getClusterId()) {
-                    Revision b = Revision.fromString(commit.getValue());
-                    revisions.put(r, b);
+                    purgeCount++;
+                    op.removeMapEntry(REVISIONS, r);
                 }
             }
         }
-        return revisions;
+
+        if (op.hasChanges()) {
+            store.findAndUpdate(Collection.NODES, op);
+        }
+        return purgeCount;
     }
 
     /**

Modified: jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnmergedBranches.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnmergedBranches.java?rev=1614600&r1=1614599&r2=1614600&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnmergedBranches.java (original)
+++ jackrabbit/oak/branches/1.0/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UnmergedBranches.java Wed Jul 30 10:03:29 2014
@@ -21,7 +21,6 @@ import static com.google.common.base.Pre
 
 import java.util.Comparator;
 import java.util.List;
-import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -31,6 +30,8 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * <code>UnmergedBranches</code> contains all un-merged branches of a DocumentMK
@@ -38,6 +39,8 @@ import org.apache.jackrabbit.oak.plugins
  */
 class UnmergedBranches {
 
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
     /**
      * Map of branches with the head of the branch as key.
      */
@@ -72,17 +75,9 @@ class UnmergedBranches {
         if (doc == null) {
             return;
         }
-        SortedMap<Revision, Revision> revisions = doc.getUncommittedRevisions(context);
-        while (!revisions.isEmpty()) {
-            SortedSet<Revision> commits = new TreeSet<Revision>(comparator);
-            Revision head = revisions.lastKey();
-            commits.add(head);
-            Revision base = revisions.remove(head).asTrunkRevision();
-            while (revisions.containsKey(base)) {
-                commits.add(base);
-                base = revisions.remove(base).asTrunkRevision();
-            }
-            branches.add(new Branch(commits, base));
+        int purgeCount = doc.purgeUncommittedRevisions(context);
+        if (purgeCount > 0) {
+            log.info("Purged [{}] uncommitted branch revision entries", purgeCount);
         }
     }
 

Propchange: jackrabbit/oak/branches/1.0/oak-doc/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk/oak-doc:r1612825