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/03/26 11:00:26 UTC

svn commit: r1461044 - in /jackrabbit/oak/trunk/oak-mongomk/src: main/java/org/apache/jackrabbit/mongomk/prototype/ test/java/org/apache/jackrabbit/mongomk/ test/java/org/apache/jackrabbit/mongomk/prototype/

Author: mreutegg
Date: Tue Mar 26 10:00:26 2013
New Revision: 1461044

URL: http://svn.apache.org/r1461044
Log:
OAK-619 Lock-free MongoMK implementation
- Improve branch support
- Copied over some tests from previous MongoDB based MicroKernel implementation. Some tests are still marked ignored.
- Fixed NPE in Commit.createOrUpdateNode() (newestRev may be null)
- Disabled document splitting until it is fully implemented -> max size set to Integer.MAX_VALUE
- Fixed path issue with JSOP move and copy operation

Added:
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/BaseMongoMKTest.java   (with props)
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchMergeTest.java
      - copied, changed from r1461015, jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchMergeTest.java
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchTest.java
      - copied, changed from r1461015, jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchTest.java
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKCommitMoveTest.java
      - copied, changed from r1461015, jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKCommitMoveTest.java
Modified:
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java
    jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/AbstractMongoConnectionTest.java
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoMicroKernelTest.java

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java?rev=1461044&r1=1461043&r2=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/Commit.java Tue Mar 26 10:00:26 2013
@@ -41,8 +41,10 @@ public class Commit {
      * The maximum size of a document. If it is larger, it is split.
      */
     // TODO check which value is the best one
-    private static final int MAX_DOCUMENT_SIZE = 16 * 1024;
-    
+    //private static final int MAX_DOCUMENT_SIZE = 16 * 1024;
+    // TODO disabled until document split is fully implemented
+    private static final int MAX_DOCUMENT_SIZE = Integer.MAX_VALUE;
+
     /**
      * Whether to purge old revisions if a node gets too large. If false, old
      * revisions are stored in a separate document. If true, old revisions are
@@ -115,12 +117,38 @@ public class Commit {
         }
     }
 
+    void prepare(Revision baseRevision) {
+        if (!operations.isEmpty()) {
+            applyToDocumentStore(baseRevision);
+            applyToCache();
+        }
+    }
+
     /**
      * Apply the changes to the document store (to update MongoDB).
      */
     void applyToDocumentStore() {
+        applyToDocumentStore(null);
+    }
+
+    /**
+     * Apply the changes to the document store (to update MongoDB).
+     *
+     * @param baseRevision the base revision of this commit. Currently only
+     *                     used for branch commits.
+     */
+    void applyToDocumentStore(Revision baseRevision) {
+        // the value in _revisions.<revision> property of the commit root node
+        // regular commits use "true", which makes the commit visible to
+        // other readers. branch commits use the base revision to indicate
+        // the visibility of the commit
+        String commitValue = baseRevision != null ? baseRevision.toString() : "true";
         DocumentStore store = mk.getDocumentStore();
         String commitRootPath = null;
+        if (baseRevision != null) {
+            // branch commits always use root node as commit root
+            commitRootPath = "/";
+        }
         ArrayList<UpdateOp> newNodes = new ArrayList<UpdateOp>();
         ArrayList<UpdateOp> changedNodes = new ArrayList<UpdateOp>();
         for (String p : operations.keySet()) {
@@ -160,7 +188,7 @@ public class Commit {
             // no updates and root of commit is also new. that is,
             // it is the root of a subtree added in a commit.
             // so we try to add the root like all other nodes
-            commitRoot.addMapEntry(UpdateOp.REVISIONS + "." + revision.toString(), "true");
+            commitRoot.addMapEntry(UpdateOp.REVISIONS + "." + revision.toString(), commitValue);
             newNodes.add(commitRoot);
         }
         try {
@@ -191,7 +219,7 @@ public class Commit {
             // first to check if there was a conflict, and only then to commit
             // the revision, with the revision property set)
             if (changedNodes.size() > 0 || !commitRoot.isNew) {
-                commitRoot.addMapEntry(UpdateOp.REVISIONS + "." + revision.toString(), "true");
+                commitRoot.addMapEntry(UpdateOp.REVISIONS + "." + revision.toString(), commitValue);
                 createOrUpdateNode(store, commitRoot);
                 operations.put(commitRootPath, commitRoot);
             }
@@ -207,7 +235,7 @@ public class Commit {
         if (baseRevision != null) {
             // TODO detect conflicts here
             Revision newestRev = mk.getNewestRevision(map, revision, true);
-            if (mk.isRevisionNewer(newestRev, baseRevision)) {
+            if (newestRev != null && mk.isRevisionNewer(newestRev, baseRevision)) {
                 // TODO transaction rollback
                 throw new MicroKernelException("The node " + 
                         op.path + " was changed in revision " + 

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java?rev=1461044&r1=1461043&r2=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/DocumentStore.java Tue Mar 26 10:00:26 2013
@@ -19,6 +19,11 @@ package org.apache.jackrabbit.mongomk.pr
 import java.util.List;
 import java.util.Map;
 
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.mk.api.MicroKernelException;
+
 /**
  * The interface for the backend storage for documents.
  */
@@ -34,18 +39,20 @@ public interface DocumentStore {
      * can modify it without affecting the stored version).
      *
      * @param collection the collection
-     * @param path the path
+     * @param key the key
      * @return the map, or null if not found
      */
+    @CheckForNull
     Map<String, Object> find(Collection collection, String key);
 
+    @Nonnull
     List<Map<String, Object>> query(Collection collection, String fromKey, String toKey, int limit);
     
     /**
      * Remove a document.
      *
      * @param collection the collection
-     * @param path the path
+     * @param key the key
      */
     void remove(Collection collection, String key);
 
@@ -65,8 +72,11 @@ public interface DocumentStore {
      * @param collection the collection
      * @param update the update operation
      * @return the new document
+     * @throws MicroKernelException if the operation failed.
      */    
-    Map<String, Object> createOrUpdate(Collection collection, UpdateOp update); 
+    @Nonnull
+    Map<String, Object> createOrUpdate(Collection collection, UpdateOp update)
+            throws MicroKernelException;
     
     void dispose();
 

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java?rev=1461044&r1=1461043&r2=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MemoryDocumentStore.java Tue Mar 26 10:00:26 2013
@@ -23,6 +23,8 @@ import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentNavigableMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 
+import javax.annotation.Nonnull;
+
 import org.apache.jackrabbit.mongomk.prototype.UpdateOp.Operation;
 
 /**
@@ -58,6 +60,7 @@ public class MemoryDocumentStore impleme
         return copy;
     }
     
+    @Nonnull
     public List<Map<String, Object>> query(Collection collection, String fromKey, String toKey, int limit) {
         ConcurrentSkipListMap<String, Map<String, Object>> map = getMap(collection);
         ConcurrentNavigableMap<String, Map<String, Object>> sub = map.subMap(fromKey, toKey);
@@ -94,6 +97,7 @@ public class MemoryDocumentStore impleme
         }
     }
 
+    @Nonnull
     public Map<String, Object> createOrUpdate(Collection collection, UpdateOp update) {
         ConcurrentSkipListMap<String, Map<String, Object>> map = getMap(collection);
         Map<String, Object> n;

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java?rev=1461044&r1=1461043&r2=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoDocumentStore.java Tue Mar 26 10:00:26 2013
@@ -25,6 +25,8 @@ import java.util.Map.Entry;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 
+import javax.annotation.Nonnull;
+
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import org.apache.jackrabbit.mk.api.MicroKernelException;
@@ -130,6 +132,7 @@ public class MongoDocumentStore implemen
         }
     }
     
+    @Nonnull
     @Override
     public List<Map<String, Object>> query(Collection collection,
             String fromKey, String toKey, int limit) {
@@ -172,6 +175,7 @@ public class MongoDocumentStore implemen
         }
     }
 
+    @Nonnull
     @Override
     public Map<String, Object> createOrUpdate(Collection collection, UpdateOp updateOp) {
         log("createOrUpdate", updateOp);        

Modified: jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java?rev=1461044&r1=1461043&r2=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java Tue Mar 26 10:00:26 2013
@@ -29,6 +29,7 @@ import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
@@ -139,8 +140,8 @@ public class MongoMK implements MicroKer
     /**
      * Maps branch commit revision to revision it is based on
      */
-    private final Map<String, String> branchCommits =
-            Collections.synchronizedMap(new HashMap<String, String>());
+    private final Map<Revision, Revision> branchCommits =
+            Collections.synchronizedMap(new HashMap<Revision, Revision>());
 
     /**
      * Create a new in-memory MongoMK used for testing.
@@ -265,6 +266,29 @@ public class MongoMK implements MicroKer
     }
     
     private boolean includeRevision(Revision x, Revision requestRevision) {
+        if (branchCommits.containsKey(x)) {
+            // only include if requested revision is also a branch revision
+            // with a history including x
+            Revision rev = requestRevision;
+            for (;;) {
+                if (rev != null) {
+                    if (rev.equals(x)) {
+                        return true;
+                    }
+                } else {
+                    // not part of branch identified by requestedRevision
+                    return false;
+                }
+                rev = branchCommits.get(rev);
+            }
+        }
+        // assert: x is not a branch commit
+        while (branchCommits.containsKey(requestRevision)) {
+            // reset requestRevision to branch base revision to make
+            // sure we don't include revisions committed after branch
+            // was created
+            requestRevision = branchCommits.get(requestRevision);
+        }
         if (x.getClusterId() == this.clusterId && 
                 requestRevision.getClusterId() == this.clusterId) {
             // both revisions were created by this cluster node: 
@@ -275,7 +299,7 @@ public class MongoMK implements MicroKer
         return requestRevision.compareRevisionTime(x) >= 0;
     }
     
-    boolean isRevisionNewer(Revision x, Revision previous) {
+    boolean isRevisionNewer(@Nonnull Revision x, @Nonnull Revision previous) {
         // TODO currently we only compare the timestamps
         return x.compareRevisionTime(previous) > 0;
     }
@@ -285,16 +309,23 @@ public class MongoMK implements MicroKer
      * considered valid if the given node map is the root of the commit, or the
      * commit root has the revision set. This method may read further nodes to
      * perform this check.
+     * This method also takes pending branches into consideration.
+     * The <code>readRevision</code> identifies the read revision used by the
+     * client, which may be a branch revision logged in {@link #branchCommits}.
+     * The revision <code>rev</code> is valid if it is part of the branch
+     * history of <code>readRevision</code>.
      *
      * @param rev     revision to check.
+     * @param readRevision the read revision of the client.
      * @param nodeMap the node to check.
      * @return <code>true</code> if the revision is valid; <code>false</code>
      *         otherwise.
      */
-    boolean isValidRevision(Revision rev, Map<String, Object> nodeMap) {
-        @SuppressWarnings("unchecked")
-        Map<String, String> revisions = (Map<String, String>) nodeMap.get(UpdateOp.REVISIONS);
-        if (revisions != null && revisions.containsKey(rev.toString())) {
+    boolean isValidRevision(@Nonnull Revision rev,
+                            @Nonnull Revision readRevision,
+                            @Nonnull Map<String, Object> nodeMap) {
+        //noinspection unchecked
+        if (isCommitted(rev, readRevision, (Map<String, String>) nodeMap.get(UpdateOp.REVISIONS))) {
             return true;
         }
         // check commit root
@@ -325,8 +356,37 @@ public class MongoMK implements MicroKer
             return false;
         }
         //noinspection unchecked
-        revisions = (Map<String, String>) nodeMap.get(UpdateOp.REVISIONS);
-        return revisions != null && revisions.containsKey(rev.toString());
+        return isCommitted(rev, readRevision, (Map<String, String>) nodeMap.get(UpdateOp.REVISIONS));
+    }
+
+    /**
+     * Returns <code>true</code> if the given revision is set to committed in
+     * the revisions map. That is, the revision exists in the map and the string
+     * value is <code>"true"</code> or equals the <code>readRevision</code>.
+     *
+     * @param revision  the revision to check.
+     * @param readRevision the read revision.
+     * @param revisions the revisions map, or <code>null</code> if none is set.
+     * @return <code>true</code> if the revision is committed, otherwise
+     *         <code>false</code>.
+     */
+    private boolean isCommitted(@Nonnull Revision revision,
+                                @Nonnull Revision readRevision,
+                                @Nullable Map<String, String> revisions) {
+        if (revision.equals(readRevision)) {
+            return true;
+        }
+        if (revisions == null) {
+            return false;
+        }
+        String value = revisions.get(revision.toString());
+        if (value == null) {
+            return false;
+        }
+        if (!value.equals("true")) {
+            revision = Revision.fromString(value);
+        }
+        return includeRevision(revision, readRevision);
     }
 
     public Children getChildren(String path, Revision rev, int limit) {
@@ -447,12 +507,8 @@ public class MongoMK implements MicroKer
     }
 
     @Override
-    public synchronized String getHeadRevision() throws MicroKernelException {
-        String head = headRevision.toString();
-        while (branchCommits.containsKey(head)) {
-            head = branchCommits.get(head);
-        }
-        return head;
+    public String getHeadRevision() throws MicroKernelException {
+        return headRevision.toString();
     }
 
     @Override
@@ -647,10 +703,10 @@ public class MongoMK implements MicroKer
                 String sourcePath = path;
                 String targetPath = t.readString();
                 if (!PathUtils.isAbsolute(targetPath)) {
-                    targetPath = PathUtils.concat(path, targetPath);
+                    targetPath = PathUtils.concat(rootPath, targetPath);
                 }
                 commit.moveNode(sourcePath, targetPath);
-                moveNode(sourcePath, targetPath, Revision.fromString(stripBranchRevMarker(baseRevId)), commit);
+                moveNode(sourcePath, targetPath, baseRev, commit);
                 break;
             }
             case '*': {
@@ -659,10 +715,10 @@ public class MongoMK implements MicroKer
                 String sourcePath = path;
                 String targetPath = t.readString();
                 if (!PathUtils.isAbsolute(targetPath)) {
-                    targetPath = PathUtils.concat(path, targetPath);
+                    targetPath = PathUtils.concat(rootPath, targetPath);
                 }
                 commit.copyNode(sourcePath, targetPath);
-                copyNode(sourcePath, targetPath, Revision.fromString(stripBranchRevMarker(baseRevId)), commit);
+                copyNode(sourcePath, targetPath, baseRev, commit);
                 break;
             }
             default:
@@ -670,12 +726,11 @@ public class MongoMK implements MicroKer
             }
         }
         if (baseRevId.startsWith("b")) {
-            // just commit to head currently
-            commit.apply();
+            // prepare commit
+            commit.prepare(baseRev);
             // remember branch commit
-            branchCommits.put(rev.toString(), baseRevId.substring(1));
+            branchCommits.put(rev, baseRev);
 
-            headRevision = commit.getRevision();
             return "b" + rev.toString();
 
             // String jsonBranch = branchCommits.remove(revisionId);
@@ -777,7 +832,8 @@ public class MongoMK implements MicroKer
         String value = null;
         for (String r : valueMap.keySet()) {
             Revision propRev = Revision.fromString(r);
-            if (isRevisionNewer(propRev, maxRev)) {
+            if (isRevisionNewer(propRev, maxRev)
+                    || !isValidRevision(propRev, maxRev, nodeMap)) {
                 continue;
             }
             if (firstRev == null || isRevisionNewer(propRev, firstRev)) {
@@ -799,7 +855,7 @@ public class MongoMK implements MicroKer
      * @param onlyCommitted whether only committed changes should be considered
      * @return the revision, or null if deleted
      */
-    Revision getNewestRevision(Map<String, Object> nodeMap, Revision before, boolean onlyCommitted) {
+    @Nullable Revision getNewestRevision(Map<String, Object> nodeMap, Revision before, boolean onlyCommitted) {
         if (nodeMap == null) {
             return null;
         }
@@ -848,11 +904,11 @@ public class MongoMK implements MicroKer
     }
 
     @Override
-    public String branch(String trunkRevisionId) throws MicroKernelException {
-        // TODO improve implementation if needed
-        String branchId = "b" + trunkRevisionId;
-        // branchCommits.put(branchId, "");
-        return branchId;
+    public String branch(@Nullable String trunkRevisionId) throws MicroKernelException {
+        // nothing is written when the branch is created, the returned
+        // revision simply acts as a reference to the branch base revision
+        String revisionId = trunkRevisionId != null ? trunkRevisionId : headRevision.toString();
+        return "b" + revisionId;
     }
 
     @Override
@@ -865,11 +921,22 @@ public class MongoMK implements MicroKer
 
         // reading from the branch is reading from the trunk currently
         String revisionId = branchRevisionId.substring(1).replace('+', ' ').trim();
-        String baseRevId = revisionId;
+        // make branch commits visible
+        List<Revision> branchRevisions = new ArrayList<Revision>();
+        UpdateOp op = new UpdateOp("/", Utils.getIdFromPath("/"), false);
+        Revision baseRevId = Revision.fromString(revisionId);
         while (baseRevId != null) {
-            baseRevId = branchCommits.remove(baseRevId);
+            branchRevisions.add(baseRevId);
+            op.set(UpdateOp.REVISIONS + "." + baseRevId, "true");
+            baseRevId = branchCommits.get(baseRevId);
+        }
+        store.createOrUpdate(DocumentStore.Collection.NODES, op);
+        // remove from branchCommits map after successful update
+        for (Revision r : branchRevisions) {
+            branchCommits.remove(r);
         }
-        return revisionId;
+        headRevision = newRevision();
+        return headRevision.toString();
 
         // TODO improve implementation if needed
         // if (!branchRevisionId.startsWith("b")) {

Modified: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/AbstractMongoConnectionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/AbstractMongoConnectionTest.java?rev=1461044&r1=1461043&r2=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/AbstractMongoConnectionTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/AbstractMongoConnectionTest.java Tue Mar 26 10:00:26 2013
@@ -41,18 +41,24 @@ public class AbstractMongoConnectionTest
     protected static final String DB =
             System.getProperty("mongo.db", "MongoMKDB");
 
-    protected static MongoConnection mongoConnection;
+    protected static Boolean mongoAvailable;
+
+    protected MongoConnection mongoConnection;
 
     private static Exception mongoException = null;
 
     @BeforeClass
     public static void setUpBeforeClass() throws Exception {
-        if (mongoConnection == null) {
-            mongoConnection = new MongoConnection(HOST, PORT, DB);
+        if (mongoAvailable == null) {
+            MongoConnection mongoConnection = new MongoConnection(HOST, PORT, DB);
             try {
                 mongoConnection.getDB().command(new BasicDBObject("ping", 1));
+                mongoAvailable = Boolean.TRUE;
             } catch (Exception e) {
+                mongoAvailable = Boolean.FALSE;
                 mongoException = e;
+            } finally {
+                mongoConnection.close();
             }
         }
         Assume.assumeNoException(mongoException);
@@ -60,12 +66,14 @@ public class AbstractMongoConnectionTest
 
     @Before
     public void setUpConnection() throws Exception {
+        mongoConnection = new MongoConnection(HOST, PORT, DB);
         dropCollections(mongoConnection.getDB());
     }
 
     @After
     public void tearDownConnection() throws Exception {
         dropCollections(mongoConnection.getDB());
+        mongoConnection.close();
     }
 
     protected void dropCollections(DB db) throws Exception {

Modified: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoMicroKernelTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoMicroKernelTest.java?rev=1461044&r1=1461043&r2=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoMicroKernelTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/BaseMongoMicroKernelTest.java Tue Mar 26 10:00:26 2013
@@ -39,7 +39,7 @@ import com.mongodb.DB;
  */
 public class BaseMongoMicroKernelTest extends AbstractMongoConnectionTest {
 
-    public static MicroKernel mk;
+    public MicroKernel mk;
 
     @Before
     public void setUp() throws Exception {
@@ -95,13 +95,13 @@ public class BaseMongoMicroKernelTest ex
     }
 
     protected void assertPropExists(String rev, String path, String property) {
-        String nodes = mk.getNodes(path, rev, -1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes(path, rev, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
         assertPropertyExists(obj, property);
     }
 
     protected void assertPropNotExists(String rev, String path, String property) {
-        String nodes = mk.getNodes(path, rev, -1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes(path, rev, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         if (nodes == null) {
             return;
         }
@@ -110,7 +110,7 @@ public class BaseMongoMicroKernelTest ex
     }
 
     protected void assertPropValue(String rev, String path, String property, String value) {
-        String nodes = mk.getNodes(path, rev, -1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes(path, rev, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
         assertPropertyValue(obj, property, value);
     }

Added: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/BaseMongoMKTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/BaseMongoMKTest.java?rev=1461044&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/BaseMongoMKTest.java (added)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/BaseMongoMKTest.java Tue Mar 26 10:00:26 2013
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.mongomk.prototype;
+
+import org.apache.jackrabbit.mongomk.BaseMongoMicroKernelTest;
+import org.apache.jackrabbit.mongomk.prototype.MongoMK;
+import org.junit.Before;
+
+import com.mongodb.DB;
+
+/**
+ * <code>BaseMongoMKTest</code>...
+ */
+public class BaseMongoMKTest extends BaseMongoMicroKernelTest {
+
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        DB db = mongoConnection.getDB();
+        mk = new MongoMK(db, 0);
+    }
+
+    @Override
+    public void tearDownConnection() throws Exception {
+        super.tearDownConnection();
+        ((MongoMK) mk).dispose();
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/BaseMongoMKTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/BaseMongoMKTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Copied: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchMergeTest.java (from r1461015, jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchMergeTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchMergeTest.java?p2=jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchMergeTest.java&p1=jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchMergeTest.java&r1=1461015&r2=1461044&rev=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchMergeTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchMergeTest.java Tue Mar 26 10:00:26 2013
@@ -14,26 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.mongomk.impl;
+package org.apache.jackrabbit.mongomk.prototype;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.jackrabbit.mk.api.MicroKernelException;
+import org.junit.Ignore;
+import org.junit.Test;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import org.apache.jackrabbit.mk.api.MicroKernelException;
-import org.apache.jackrabbit.mongomk.BaseMongoMicroKernelTest;
-import org.junit.Ignore;
-import org.junit.Test;
-
 /**
  * Tests for {@code MicroKernel#branch}
  */
-public class MongoMKBranchMergeTest extends BaseMongoMicroKernelTest {
+public class MongoMKBranchMergeTest extends BaseMongoMKTest {
 
     @Test
     public void oneBranchAddedChildren1() {
@@ -81,6 +80,7 @@ public class MongoMKBranchMergeTest exte
         assertNodesExist(null, "/root", "/root/child1");
 
         String branchRev = mk.branch(null);
+        System.out.println("branchRev: " + branchRev);
 
         addNodes(null, "/root/child2");
         assertNodesExist(null, "/root", "/root/child1", "/root/child2");
@@ -143,7 +143,7 @@ public class MongoMKBranchMergeTest exte
         branchRev = mk.merge(branchRev, "");
         assertPropExists(branchRev, "/", "jcr:primaryType");
 
-        String mergedNode = mk.getNodes("/", branchRev, -1, 0, -1, null);
+        String mergedNode = mk.getNodes("/", branchRev, 0, 0, -1, null);
         String expectedNode = "{\"jcr:primaryType\":\"nam:rep:root\",\":childNodeCount\":0}";
         assertEquals("Wrong property value after merge", expectedNode, mergedNode);
     }
@@ -230,6 +230,7 @@ public class MongoMKBranchMergeTest exte
     }
 
     @Test
+    @Ignore
     public void twoBranchesAddedChildren1() {
         addNodes(null, "/trunk", "/trunk/child1");
         assertNodesExist(null, "/trunk", "/trunk/child1");
@@ -261,6 +262,7 @@ public class MongoMKBranchMergeTest exte
     }
 
     @Test
+    @Ignore
     public void oneBranchAddedChildrenWithConflict() {
         addNodes(null, "/trunk", "/trunk/child1");
         assertNodesExist(null, "/trunk", "/trunk/child1");
@@ -280,6 +282,7 @@ public class MongoMKBranchMergeTest exte
     }
 
     @Test
+    @Ignore
     public void oneBranchChangedPropertiesWithConflict() {
         addNodes(null, "/trunk");
         setProp(null, "/trunk/prop1", "value1");
@@ -298,6 +301,7 @@ public class MongoMKBranchMergeTest exte
     }
 
     @Test
+    @Ignore
     public void addExistingRootInBranch() {
         addNodes(null, "/root");
         assertNodesExist(null, "/root");
@@ -310,6 +314,7 @@ public class MongoMKBranchMergeTest exte
     }
 
     @Test
+    @Ignore
     public void addExistingChildInBranch() {
         addNodes(null, "/root", "/root/child1");
         assertNodesExist(null, "/root", "/root/child1");
@@ -350,6 +355,7 @@ public class MongoMKBranchMergeTest exte
     }
 
     @Test
+    @Ignore
     public void movesInBranch() {
         String rev = mk.commit("/", "+\"a\":{\"b\":{}}", null, null);
         String branchRev = mk.branch(rev);

Copied: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchTest.java (from r1461015, jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchTest.java?p2=jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchTest.java&p1=jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchTest.java&r1=1461015&r2=1461044&rev=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKBranchTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKBranchTest.java Tue Mar 26 10:00:26 2013
@@ -14,9 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.mongomk.impl;
+package org.apache.jackrabbit.mongomk.prototype;
 
-import org.apache.jackrabbit.mongomk.BaseMongoMicroKernelTest;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.junit.Test;
@@ -28,7 +27,7 @@ import static org.junit.Assert.assertTru
  * <code>MongoMKBranchTest</code> performs a test to check if commits
  * to a branch are not visible to other branches.
  */
-public class MongoMKBranchTest extends BaseMongoMicroKernelTest {
+public class MongoMKBranchTest extends BaseMongoMKTest {
 
     /**
      * Creates the following revision history:
@@ -55,7 +54,7 @@ public class MongoMKBranchTest extends B
         String rev2 = mk.commit("", "+\"/child2\":{}", null, "");
 
         String branchRev2 = mk.branch(rev2);
-        String json = mk.getNodes("/child1", branchRev2, 1000, 0, -1, null);
+        String json = mk.getNodes("/child1", branchRev2, 0, 0, -1, null);
         JSONParser parser = new JSONParser();
         JSONObject obj = (JSONObject) parser.parse(json);
         assertFalse(obj.containsKey("foo"));

Copied: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKCommitMoveTest.java (from r1461015, jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKCommitMoveTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKCommitMoveTest.java?p2=jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKCommitMoveTest.java&p1=jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKCommitMoveTest.java&r1=1461015&r2=1461044&rev=1461044&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/MongoMKCommitMoveTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/MongoMKCommitMoveTest.java Tue Mar 26 10:00:26 2013
@@ -14,21 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.mongomk.impl;
+package org.apache.jackrabbit.mongomk.prototype;
+
+import org.apache.jackrabbit.mongomk.impl.MongoMicroKernel;
+import org.json.simple.JSONObject;
+import org.junit.Ignore;
+import org.junit.Test;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import org.apache.jackrabbit.mongomk.BaseMongoMicroKernelTest;
-import org.json.simple.JSONObject;
-import org.junit.Test;
-
 /**
  * Tests for {@link MongoMicroKernel#commit(String, String, String, String)}
  * with emphasis on move operations.
  */
-public class MongoMKCommitMoveTest extends BaseMongoMicroKernelTest {
+@Ignore
+public class MongoMKCommitMoveTest extends BaseMongoMKTest {
 
     @Test
     public void moveNode() throws Exception {
@@ -116,16 +118,16 @@ public class MongoMKCommitMoveTest exten
     public void moveNodeWithProperties() throws Exception {
         mk.commit("/", "+\"a\" : { \"key1\" : \"value1\" }", null, null);
         assertTrue(mk.nodeExists("/a", null));
-        String nodes = mk.getNodes("/", null, 1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes("/a", null, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
-        assertPropertyValue(obj, "a/key1", "value1");
+        assertPropertyValue(obj, "key1", "value1");
 
         mk.commit("/", ">\"a\" : \"c\"", null, null);
         assertFalse(mk.nodeExists("/a", null));
         assertTrue(mk.nodeExists("/c", null));
-        nodes = mk.getNodes("/", null, 1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        nodes = mk.getNodes("/c", null, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         obj = parseJSONObject(nodes);
-        assertPropertyValue(obj, "c/key1", "value1");
+        assertPropertyValue(obj, "key1", "value1");
     }
 
     @Test
@@ -249,9 +251,9 @@ public class MongoMKCommitMoveTest exten
         assertFalse(mk.nodeExists("/a", null));
         assertTrue(mk.nodeExists("/c", null));
 
-        String nodes = mk.getNodes("/", null, 1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes("/c", null, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
-        assertPropertyValue(obj, "c/key1", "value1");
+        assertPropertyValue(obj, "key1", "value1");
     }
 
     @Test
@@ -265,9 +267,9 @@ public class MongoMKCommitMoveTest exten
         assertTrue(mk.nodeExists("/c", null));
         assertTrue(mk.nodeExists("/c/b", null));
 
-        String nodes = mk.getNodes("/", null, 2 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes("/c/b", null, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
-        assertPropertyValue(obj, "c/b/key1", "value1");
+        assertPropertyValue(obj, "key1", "value1");
     }
 
     @Test
@@ -281,9 +283,9 @@ public class MongoMKCommitMoveTest exten
         assertTrue(mk.nodeExists("/b", null));
         assertTrue(mk.nodeExists("/c", null));
 
-        String nodes = mk.getNodes("/", null, 1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes("/c", null, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
-        assertPropertyValue(obj, "c/key1", "value1");
+        assertPropertyValue(obj, "key1", "value1");
     }
 
     @Test
@@ -297,9 +299,9 @@ public class MongoMKCommitMoveTest exten
         assertTrue(mk.nodeExists("/c", null));
         assertTrue(mk.nodeExists("/c/b", null));
 
-        String nodes = mk.getNodes("/", null, 1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes("/c/b", null, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
-        assertPropertyNotExists(obj, "c/b/key1");
+        assertPropertyNotExists(obj, "key1");
     }
 
     @Test
@@ -311,9 +313,9 @@ public class MongoMKCommitMoveTest exten
         assertFalse(mk.nodeExists("/a", null));
         assertTrue(mk.nodeExists("/c", null));
 
-        String nodes = mk.getNodes("/", null, 1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes("/c", null, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
-        assertPropertyNotExists(obj, "c/key1");
+        assertPropertyNotExists(obj, "key1");
     }
 
     @Test
@@ -327,9 +329,9 @@ public class MongoMKCommitMoveTest exten
         assertTrue(mk.nodeExists("/b", null));
         assertTrue(mk.nodeExists("/c", null));
 
-        String nodes = mk.getNodes("/", null, 1 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
+        String nodes = mk.getNodes("/c", null, 0 /*depth*/, 0 /*offset*/, -1 /*maxChildNodes*/, null /*filter*/);
         JSONObject obj = parseJSONObject(nodes);
-        assertPropertyNotExists(obj, "c/key1");
+        assertPropertyNotExists(obj, "key1");
     }
 
     @Test