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/10 15:42:51 UTC

svn commit: r1501767 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/mongomk/ test/java/org/apache/jackrabbit/oak/plugins/mongomk/

Author: mreutegg
Date: Wed Jul 10 13:42:50 2013
New Revision: 1501767

URL: http://svn.apache.org/r1501767
Log:
OAK-619 Lock-free MongoMK implementation
- Improved rebase implementation with more tests enabled

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Branch.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKRebaseTest.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=1501767&r1=1501766&r2=1501767&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 Wed Jul 10 13:42:50 2013
@@ -35,31 +35,61 @@ class Branch {
     /**
      * The commits to the branch
      */
-    private final TreeMap<Revision, UnsavedModifications> commits;
+    private final TreeMap<Revision, Commit> commits;
 
-    private volatile Revision base;
+    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, UnsavedModifications>(
+        this.commits = new TreeMap<Revision, Commit>(
                 checkNotNull(comparator));
         for (Revision r : commits) {
-            this.commits.put(r, new UnsavedModifications());
+            this.commits.put(r, new Commit(base));
         }
     }
 
+    /**
+     * @return the initial base of this branch.
+     */
     Revision getBase() {
         return base;
     }
 
-    public void setBase(Revision base) {
-        this.base = base;
+    /**
+     * Returns the base revision for the given branch revision <code>r</code>.
+     *
+     * @param r revision of a commit in this branch.
+     * @return the base revision for <code>r</code>.
+     * @throws IllegalArgumentException if <code>r</code> is not a commit of
+     *                                  this branch.
+     */
+    synchronized Revision getBase(Revision r) {
+        Commit c = commits.get(r);
+        if (c == null) {
+            throw new IllegalArgumentException(
+                    "Revision " + r + " is not a commit in this branch");
+        }
+        return c.getBase();
     }
+
+    /**
+     * Rebases the last commit of this branch to the given revision.
+     *
+     * @param head the new head of the branch.
+     * @param base rebase to this revision.
+     */
+    synchronized void rebase(Revision head, Revision base) {
+        Revision last = commits.lastKey();
+        checkArgument(commits.comparator().compare(head, last) > 0);
+        commits.put(head, new Commit(base));
+    }
+
     synchronized void addCommit(@Nonnull Revision r) {
-        checkArgument(commits.comparator().compare(r, commits.lastKey()) > 0);
-        commits.put(r, new UnsavedModifications());
+        Revision last = commits.lastKey();
+        checkArgument(commits.comparator().compare(r, last) > 0);
+        commits.put(r, new Commit(commits.get(last).getBase()));
     }
 
     synchronized SortedSet<Revision> getCommits() {
@@ -90,12 +120,12 @@ class Branch {
      */
     @Nonnull
     public synchronized UnsavedModifications getModifications(@Nonnull Revision r) {
-        UnsavedModifications modifications = commits.get(r);
-        if (modifications == null) {
+        Commit c = commits.get(r);
+        if (c == null) {
             throw new IllegalArgumentException(
                     "Revision " + r + " is not a commit in this branch");
         }
-        return modifications;
+        return c.getModifications();
     }
 
     /**
@@ -108,8 +138,8 @@ class Branch {
      */
     public synchronized void applyTo(@Nonnull UnsavedModifications trunk) {
         checkNotNull(trunk);
-        for (UnsavedModifications modifications : commits.values()) {
-            modifications.applyTo(trunk);
+        for (Commit c : commits.values()) {
+            c.getModifications().applyTo(trunk);
         }
     }
 
@@ -129,12 +159,30 @@ class Branch {
             if (readRevision.compareRevisionTime(r) < 0) {
                 continue;
             }
-            UnsavedModifications modifications = commits.get(r);
-            Revision modRevision = modifications.get(path);
+            Commit c = commits.get(r);
+            Revision modRevision = c.getModifications().get(path);
             if (modRevision != null) {
                 return modRevision;
             }
         }
         return null;
     }
+
+    private static final class Commit {
+
+        private final UnsavedModifications modifications = new UnsavedModifications();
+        private final Revision base;
+
+        Commit(Revision base) {
+            this.base = base;
+        }
+
+        Revision getBase() {
+            return base;
+        }
+
+        UnsavedModifications getModifications() {
+            return modifications;
+        }
+    }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java?rev=1501767&r1=1501766&r2=1501767&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMK.java Wed Jul 10 13:42:50 2013
@@ -477,7 +477,7 @@ public class MongoMK implements MicroKer
             // reset requestRevision to branch base revision to make
             // sure we don't include revisions committed after branch
             // was created
-            requestRevision = b.getBase();
+            requestRevision = b.getBase(requestRevision);
         }
         return revisionComparator.compare(requestRevision, x) >= 0;
     }
@@ -706,9 +706,10 @@ public class MongoMK implements MicroKer
         }
         // filter out revisions newer than branch base
         if (branch != null) {
+            Revision base = branch.getBase(readRevision);
             for (Iterator<Revision> it = lastRevs.values().iterator(); it.hasNext(); ) {
                 Revision r = it.next();
-                if (isRevisionNewer(r, branch.getBase())) {
+                if (isRevisionNewer(r, base)) {
                     it.remove();
                 }
             }
@@ -1461,11 +1462,10 @@ public class MongoMK implements MicroKer
         if (b.getBase().equals(base)) {
             return branchRevisionId;
         }
-        b.setBase(base);
         // add a pseudo commit to make sure current head of branch
         // has a higher revision than base of branch
         Revision head = newRevision();
-        b.addCommit(head);
+        b.rebase(head, base);
         return "b" + head.toString();
     }
 

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKRebaseTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKRebaseTest.java?rev=1501767&r1=1501766&r2=1501767&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKRebaseTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoMKRebaseTest.java Wed Jul 10 13:42:50 2013
@@ -100,7 +100,6 @@ public class MongoMKRebaseTest extends B
     }
 
     @Test
-    @Ignore
     public void rebaseAddProperty() {
         mk.commit("", "+\"/x\":{\"y\":{}}", null, null);
         String branch = mk.branch(null);
@@ -122,7 +121,6 @@ public class MongoMKRebaseTest extends B
     }
 
     @Test
-    @Ignore
     public void rebaseRemoveProperty() {
         mk.commit("", "+\"/x\":{\"y\":{\"p\":42}}", null, null);
         String branch = mk.branch(null);
@@ -144,7 +142,6 @@ public class MongoMKRebaseTest extends B
     }
 
     @Test
-    @Ignore
     public void rebaseChangeProperty() {
         mk.commit("", "+\"/x\":{\"y\":{\"p\":42}}", null, null);
         String branch = mk.branch(null);