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 2013/07/11 15:00:25 UTC

svn commit: r1502211 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Branch.java

Author: mreutegg
Date: Thu Jul 11 13:00:24 2013
New Revision: 1502211

URL: http://svn.apache.org/r1502211
Log:
OAK-893: MongoMK may fail with MicroKernelException under concurrent commits
- Document and rename private class Commit to BranchCommit to better distinguish it from existing Commit class

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Branch.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Branch.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Branch.java?rev=1502211&r1=1502210&r2=1502211&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Branch.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Branch.java Thu Jul 11 13:00:24 2013
@@ -28,25 +28,27 @@ import static com.google.common.base.Pre
 
 /**
  * Contains commit information about a branch and its base revision.
- * TODO document
  */
 class Branch {
 
     /**
      * The commits to the branch
      */
-    private final TreeMap<Revision, Commit> commits;
+    private final TreeMap<Revision, BranchCommit> commits;
 
+    /**
+     * The initial base revision of this branch.
+     */
     private final Revision base;
 
     Branch(@Nonnull SortedSet<Revision> commits,
            @Nonnull Revision base,
            @Nonnull Revision.RevisionComparator comparator) {
         this.base = checkNotNull(base);
-        this.commits = new TreeMap<Revision, Commit>(
+        this.commits = new TreeMap<Revision, BranchCommit>(
                 checkNotNull(comparator));
         for (Revision r : commits) {
-            this.commits.put(r, new Commit(base));
+            this.commits.put(r, new BranchCommit(base));
         }
     }
 
@@ -66,7 +68,7 @@ class Branch {
      *                                  this branch.
      */
     synchronized Revision getBase(Revision r) {
-        Commit c = commits.get(r);
+        BranchCommit c = commits.get(r);
         if (c == null) {
             throw new IllegalArgumentException(
                     "Revision " + r + " is not a commit in this branch");
@@ -83,31 +85,56 @@ class Branch {
     synchronized void rebase(Revision head, Revision base) {
         Revision last = commits.lastKey();
         checkArgument(commits.comparator().compare(head, last) > 0);
-        commits.put(head, new Commit(base));
+        commits.put(head, new BranchCommit(base));
     }
 
+    /**
+     * Adds a new commit with revision <code>r</code> to this branch.
+     *
+     * @param r the revision of the branch commit to add.
+     */
     synchronized void addCommit(@Nonnull Revision r) {
         Revision last = commits.lastKey();
         checkArgument(commits.comparator().compare(r, last) > 0);
-        commits.put(r, new Commit(commits.get(last).getBase()));
+        commits.put(r, new BranchCommit(commits.get(last).getBase()));
     }
 
+    /**
+     * @return the commits to this branch.
+     */
     synchronized SortedSet<Revision> getCommits() {
         SortedSet<Revision> revisions = new TreeSet<Revision>(commits.comparator());
         revisions.addAll(commits.keySet());
         return revisions;
     }
 
+    /**
+     * @return <code>true</code> if this branch contains any commits;
+     *         <code>false</code> otherwise.
+     */
     synchronized boolean hasCommits() {
         return !commits.isEmpty();
     }
 
+    /**
+     * Checks if this branch contains a commit with the given revision.
+     *
+     * @param r the revision of a commit.
+     * @return <code>true</code> if this branch contains a commit with the given
+     *         revision; <code>false</code> otherwise.
+     */
     synchronized boolean containsCommit(@Nonnull Revision r) {
         return commits.containsKey(r);
     }
 
-    public synchronized void removeCommit(@Nonnull Revision rev) {
-        commits.remove(rev);
+    /**
+     * Removes the commit with the given revision <code>r</code>. Does nothing
+     * if there is no such commit.
+     *
+     * @param r the revision of the commit to remove.
+     */
+    public synchronized void removeCommit(@Nonnull Revision r) {
+        commits.remove(r);
     }
 
     /**
@@ -120,7 +147,7 @@ class Branch {
      */
     @Nonnull
     public synchronized UnsavedModifications getModifications(@Nonnull Revision r) {
-        Commit c = commits.get(r);
+        BranchCommit c = commits.get(r);
         if (c == null) {
             throw new IllegalArgumentException(
                     "Revision " + r + " is not a commit in this branch");
@@ -138,7 +165,7 @@ class Branch {
     public synchronized void applyTo(@Nonnull UnsavedModifications trunk,
                                      @Nonnull Revision mergeCommit) {
         checkNotNull(trunk);
-        for (Commit c : commits.values()) {
+        for (BranchCommit c : commits.values()) {
             c.getModifications().applyTo(trunk, mergeCommit);
         }
     }
@@ -159,7 +186,7 @@ class Branch {
             if (readRevision.compareRevisionTime(r) < 0) {
                 continue;
             }
-            Commit c = commits.get(r);
+            BranchCommit c = commits.get(r);
             Revision modRevision = c.getModifications().get(path);
             if (modRevision != null) {
                 return modRevision;
@@ -168,12 +195,12 @@ class Branch {
         return null;
     }
 
-    private static final class Commit {
+    private static final class BranchCommit {
 
         private final UnsavedModifications modifications = new UnsavedModifications();
         private final Revision base;
 
-        Commit(Revision base) {
+        BranchCommit(Revision base) {
             this.base = base;
         }