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/04 16:14:03 UTC

svn commit: r1538644 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/mongomk: Commit.java MongoNodeStore.java

Author: mreutegg
Date: Mon Nov  4 15:14:03 2013
New Revision: 1538644

URL: http://svn.apache.org/r1538644
Log:
OAK-1080: MongoMK: improved concurrency
- always write back _lastRev in background thread to make sure it contains in fact the last modified revision for this cluster instance

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

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=1538644&r1=1538643&r2=1538644&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 Mon Nov  4 15:14:03 2013
@@ -204,11 +204,6 @@ public class Commit {
         UpdateOp commitRoot = getUpdateOperationForNode(commitRootPath);
         for (String p : operations.keySet()) {
             UpdateOp op = operations.get(p);
-            if (baseBranchRevision == null) {
-                // only apply _lastRev for trunk commits, _lastRev for
-                // branch commits only become visible on merge
-                NodeDocument.setLastRev(op, revision);
-            }
             if (op.isNew()) {
                 NodeDocument.setDeleted(op, revision, false);
             }

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=1538644&r1=1538643&r2=1538644&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 Mon Nov  4 15:14:03 2013
@@ -290,6 +290,9 @@ public final class MongoNodeStore
             n = new Node("/", headRevision);
             commit.addNode(n);
             commit.applyToDocumentStore();
+            commit.applyToCache(false);
+            // make sure _lastRev is written back to store
+            backgroundWrite();
         } else {
             // initialize branchCommits
             branches.init(store, this);
@@ -302,10 +305,6 @@ public final class MongoNodeStore
     }
 
     public void dispose() {
-        // force background write (with asyncDelay > 0, the root wouldn't be written)
-        // TODO make this more obvious / explicit
-        // TODO tests should also work if this is not done
-        asyncDelay = 0;
         runBackgroundOperations();
         if (!isDisposed.getAndSet(true)) {
             synchronized (isDisposed) {
@@ -658,26 +657,18 @@ public final class MongoNodeStore
             Revision branchRev = rev.asBranchRevision();
             unsaved = branches.getBranch(branchRev).getModifications(branchRev);
         }
-        // track unsaved modifications of nodes that were not
-        // written in the commit (implicitly modified parent)
-        // or any modification if this is a branch commit
-        if (!isWritten || isBranchCommit) {
-            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);
-                }
+        // 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);
             }
-        } else {
-            // the document was updated:
-            // we no longer need to update it in a background process
-            unsaved.remove(path);
         }
         String key = path + "@" + rev;
         Node.Children c = nodeChildrenCache.getIfPresent(key);
@@ -1113,7 +1104,6 @@ public final class MongoNodeStore
 
         });
 
-        long now = Revision.getCurrentTimestamp();
         UpdateOp updateOp = null;
         Revision lastRev = null;
         List<String> ids = new ArrayList<String>();
@@ -1123,12 +1113,6 @@ public final class MongoNodeStore
             if (r == null) {
                 continue;
             }
-            // FIXME: with below code fragment the root (and other nodes
-            // 'close' to the root) will not be updated in MongoDB when there
-            // are frequent changes.
-            if (Revision.getTimestampDifference(now, r.getTimestamp()) < asyncDelay) {
-                continue;
-            }
             int size = ids.size();
             if (updateOp == null) {
                 // create UpdateOp