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/11/06 11:18:31 UTC
svn commit: r1539296 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk:
Commit.java MongoNodeStore.java NodeDocument.java
Author: mreutegg
Date: Wed Nov 6 10:18:31 2013
New Revision: 1539296
URL: http://svn.apache.org/r1539296
Log:
OAK-1080: MongoMK: improved concurrency
- set _lastRev on insert, in all other cases update _lastRev with background thread
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Commit.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Commit.java?rev=1539296&r1=1539295&r2=1539296&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Commit.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/Commit.java Wed Nov 6 10:18:31 2013
@@ -212,6 +212,10 @@ public class Commit {
} else {
NodeDocument.setCommitRoot(op, revision, commitRootDepth);
if (op.isNew()) {
+ // for new nodes we can safely set _lastRev on insert.
+ // for existing nodes the _lastRev is updated by the
+ // background thread to avoid concurrent updates
+ NodeDocument.setLastRev(op, revision);
newNodes.add(op);
} else {
changedNodes.add(op);
@@ -237,6 +241,9 @@ public class Commit {
// (because there might be a conflict)
NodeDocument.unsetRevision(commitRoot, revision);
}
+ // setting _lastRev is only safe on insert. now the
+ // background thread needs to take care of it
+ NodeDocument.unsetLastRev(op, revision.getClusterId());
changedNodes.add(op);
}
newNodes.clear();
@@ -442,9 +449,10 @@ public class Commit {
}
UpdateOp op = operations.get(path);
boolean isNew = op != null && op.isNew();
- boolean isWritten = op != null;
+ boolean pendingLastRev = op == null
+ || !NodeDocument.hasLastRev(op, revision.getClusterId());
boolean isDelete = op != null && op.isDelete();
- nodeStore.applyChanges(revision, path, isNew, isDelete, isWritten, isBranchCommit, added, removed);
+ nodeStore.applyChanges(revision, path, isNew, isDelete, pendingLastRev, isBranchCommit, added, removed);
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeStore.java?rev=1539296&r1=1539295&r2=1539296&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/MongoNodeStore.java Wed Nov 6 10:18:31 2013
@@ -644,14 +644,14 @@ public final class MongoNodeStore
* @param path the path
* @param isNew whether this is a new node
* @param isDelete whether the node is deleted
- * @param isWritten whether the MongoDB documented was added / updated
+ * @param pendingLastRev whether the node has a pending _lastRev to write
* @param isBranchCommit whether this is from a branch commit
* @param added the list of added child nodes
* @param removed the list of removed child nodes
*
*/
public void applyChanges(Revision rev, String path,
- boolean isNew, boolean isDelete, boolean isWritten,
+ boolean isNew, boolean isDelete, boolean pendingLastRev,
boolean isBranchCommit, ArrayList<String> added,
ArrayList<String> removed) {
UnsavedModifications unsaved = unsavedLastRevisions;
@@ -659,17 +659,19 @@ public final class MongoNodeStore
Revision branchRev = rev.asBranchRevision();
unsaved = branches.getBranch(branchRev).getModifications(branchRev);
}
- // write back _lastRev with background thread
- Revision prev = unsaved.put(path, rev);
- if (prev != null) {
- if (isRevisionNewer(prev, rev)) {
- // revert
- unsaved.put(path, prev);
- String msg = String.format("Attempt to update " +
- "unsavedLastRevision for %s with %s, which is " +
- "older than current %s.",
- path, rev, prev);
- throw new MicroKernelException(msg);
+ if (isBranchCommit || pendingLastRev) {
+ // write back _lastRev with background thread
+ Revision prev = unsaved.put(path, rev);
+ if (prev != null) {
+ if (isRevisionNewer(prev, rev)) {
+ // revert
+ unsaved.put(path, prev);
+ String msg = String.format("Attempt to update " +
+ "unsavedLastRevision for %s with %s, which is " +
+ "older than current %s.",
+ path, rev, prev);
+ throw new MicroKernelException(msg);
+ }
}
}
String key = path + "@" + rev;
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java?rev=1539296&r1=1539295&r2=1539296&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk/NodeDocument.java Wed Nov 6 10:18:31 2013
@@ -813,6 +813,16 @@ public class NodeDocument extends Docume
revision.toString());
}
+ public static boolean hasLastRev(@Nonnull UpdateOp op, int clusterId) {
+ return checkNotNull(op).getChanges().containsKey(
+ new Key(LAST_REV, new Revision(0, 0, clusterId)));
+ }
+
+ public static void unsetLastRev(@Nonnull UpdateOp op, int clusterId) {
+ checkNotNull(op).unsetMapEntry(LAST_REV,
+ new Revision(0, 0, clusterId));
+ }
+
public static void setCommitRoot(@Nonnull UpdateOp op,
@Nonnull Revision revision,
int commitRootDepth) {