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/06 14:03:06 UTC
svn commit: r1453320 -
/jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
Author: mreutegg
Date: Wed Mar 6 13:03:06 2013
New Revision: 1453320
URL: http://svn.apache.org/r1453320
Log:
OAK-619 Lock-free MongoMK implementation
- remember branch commits and ignore them in getHeadRevision()
Modified:
jackrabbit/oak/trunk/oak-mongomk/src/main/java/org/apache/jackrabbit/mongomk/prototype/MongoMK.java
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=1453320&r1=1453319&r2=1453320&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 Wed Mar 6 13:03:06 2013
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.mongomk.pr
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
@@ -129,8 +130,12 @@ public class MongoMK implements MicroKer
private Revision headRevision;
private Thread backgroundThread;
-
- private final Map<String, String> branchCommits = new HashMap<String, String>();
+
+ /**
+ * Maps branch commit revision to revision it is based on
+ */
+ private final Map<String, String> branchCommits =
+ Collections.synchronizedMap(new HashMap<String, String>());
/**
* Create a new in-memory MongoMK used for testing.
@@ -313,7 +318,11 @@ public class MongoMK implements MicroKer
@Override
public String getHeadRevision() throws MicroKernelException {
- return headRevision.toString();
+ String head = headRevision.toString();
+ while (branchCommits.containsKey(head)) {
+ head = branchCommits.get(head);
+ }
+ return head;
}
@Override
@@ -466,8 +475,11 @@ public class MongoMK implements MicroKer
if (revisionId.startsWith("b")) {
// just commit to head currently
applyCommit(commit);
+ // remember branch commit
+ branchCommits.put(rev.toString(), revisionId.substring(1));
+
return "b" + rev.toString();
-
+
// String jsonBranch = branchCommits.remove(revisionId);
// jsonBranch += commit.getDiff().toString();
// String branchRev = revisionId + "+";
@@ -594,15 +606,24 @@ public class MongoMK implements MicroKer
@Override
public String merge(String branchRevisionId, String message)
throws MicroKernelException {
+ // TODO improve implementation if needed
+ if (!branchRevisionId.startsWith("b")) {
+ throw new MicroKernelException("Not a branch: " + branchRevisionId);
+ }
+
// reading from the branch is reading from the trunk currently
String revisionId = branchRevisionId.substring(1).replace('+', ' ').trim();
+ String baseRevId = revisionId;
+ while (baseRevId != null) {
+ baseRevId = branchCommits.remove(baseRevId);
+ }
return revisionId;
-
+
// TODO improve implementation if needed
// if (!branchRevisionId.startsWith("b")) {
// throw new MicroKernelException("Not a branch: " + branchRevisionId);
// }
- //
+ //
// String commit = branchCommits.remove(branchRevisionId);
// return commit("", commit, null, null);
}