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