From 92d9f7267d4ff56d57668abed3a971b7d97b03d9 Mon Sep 17 00:00:00 2001
From: Tudor Rogoz <rogoz@adobe.com>
Date: Thu, 22 Nov 2012 10:30:15 +0200
Subject: [PATCH] OAK-461 Commit time is increasing when performing multiple
 sequentially commits

---
 oak-mongomk/pom.xml                                |    6 ++-
 .../mongomk/impl/command/CommitCommandTest.java    |   22 ++++++++++-
 .../ConcurrentWriteMultipleMkMongoTest.java        |   39 +++++++++++---------
 3 files changed, 47 insertions(+), 20 deletions(-)

diff --git a/oak-mongomk/pom.xml b/oak-mongomk/pom.xml
index df57226..6e489cc 100644
--- a/oak-mongomk/pom.xml
+++ b/oak-mongomk/pom.xml
@@ -166,7 +166,11 @@
       <artifactId>json-simple</artifactId>
       <version>1.1</version>
     </dependency>
-
+	<dependency>
+       <groupId>com.jamonapi</groupId>
+       <artifactId>jamon</artifactId>
+       <version>2.4</version>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandTest.java b/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandTest.java
index 0afea83..c9ead1f 100644
--- a/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandTest.java
+++ b/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/command/CommitCommandTest.java
@@ -24,8 +24,12 @@ import org.apache.jackrabbit.mongomk.impl.model.CommitBuilder;
 import org.apache.jackrabbit.mongomk.util.MongoUtil;
 import org.apache.jackrabbit.mongomk.util.NodeBuilder;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 
+import com.jamonapi.Monitor;
+import com.jamonapi.MonitorFactory;
+
 /**
  * Tests for {@code CommitCommandMongo}
  */
@@ -42,8 +46,8 @@ public class CommitCommandTest extends BaseMongoMicroKernelTest {
                 "{ \"/#%1$s\" : { \"a#%1$s\" : { \"b#%1$s\" : {} , \"c#%1$s\" : {} } } }", revisionId)));
 
         MongoAssert.assertCommitExists(commit);
-        MongoAssert.assertCommitContainsAffectedPaths(MongoUtil.fromMongoRepresentation(commit.getRevisionId()),
-                "/", "/a", "/a/b", "/a/c");
+        MongoAssert.assertCommitContainsAffectedPaths(MongoUtil.fromMongoRepresentation(commit.getRevisionId()), "/",
+                "/a", "/a/b", "/a/c");
         MongoAssert.assertHeadRevision(1);
         MongoAssert.assertNextRevision(2);
     }
@@ -76,4 +80,18 @@ public class CommitCommandTest extends BaseMongoMicroKernelTest {
         MongoAssert.assertNodeRevisionId("/a/d", rev2, true);
         MongoAssert.assertNodeRevisionId("/a/e", rev2, true);
     }
+    
+    @Ignore("It takes aprox. 5 minutes")
+    @Test
+    public void testCommitTimeRamp() throws Exception {
+        Monitor commitMonitor = MonitorFactory.getTimeMonitor("commit");
+        for (int i = 0; i < 1000; i++) {
+            commitMonitor.start();
+            mk.commit("/", "+\"a"+i+"\" : {} +\"b"+i+"\" : {} +\"c"+i+"\" : {}",
+                    null, null);
+            commitMonitor.stop();
+            if (i%25==0) System.out.println(commitMonitor.getLastValue());
+        }
+        System.out.println("Final Results:"+commitMonitor);
+    } 
 }
\ No newline at end of file
diff --git a/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/command/ConcurrentWriteMultipleMkMongoTest.java b/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/command/ConcurrentWriteMultipleMkMongoTest.java
index e8fd2f4..e50fb1e 100644
--- a/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/command/ConcurrentWriteMultipleMkMongoTest.java
+++ b/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/impl/command/ConcurrentWriteMultipleMkMongoTest.java
@@ -12,6 +12,8 @@ import org.apache.jackrabbit.mongomk.impl.blob.MongoGridFSBlobStore;
 import org.junit.Ignore;
 import org.junit.Test;
 
+import com.jamonapi.Monitor;
+import com.jamonapi.MonitorFactory;
 import com.mongodb.DB;
 
 /**
@@ -25,7 +27,6 @@ public class ConcurrentWriteMultipleMkMongoTest extends BaseMongoMicroKernelTest
     }
 
     @Test
-    @Ignore // Ignored only because it takes a while to complete.
     public void testThousandNodes() throws Exception {
         doTest(1000);
     }
@@ -34,16 +35,16 @@ public class ConcurrentWriteMultipleMkMongoTest extends BaseMongoMicroKernelTest
 
         int numberOfChildren = 10;
         int numberOfMks = 3;
-        String[] prefixes = new String[]{"a", "b", "c", "d", "e", "f"};
+        String[] prefixes = new String[] { "a", "b", "c", "d", "e", "f" };
 
         ExecutorService executor = Executors.newFixedThreadPool(numberOfMks);
         for (int i = 0; i < numberOfMks; i++) {
-            String diff = buildPyramidDiff("/", 0, numberOfChildren,
-                    numberOfNodes, prefixes[i], new StringBuilder()).toString();
-            //System.out.println(diff);
+            String diff = buildPyramidDiff("/", 0, numberOfChildren, numberOfNodes, prefixes[i], new StringBuilder())
+                    .toString();
+            // System.out.println(diff);
             DB db = mongoConnection.getDB();
-            MongoMicroKernel mk = new MongoMicroKernel(mongoConnection,
-                    new MongoNodeStore(db), new MongoGridFSBlobStore(db));
+            MongoMicroKernel mk = new MongoMicroKernel(mongoConnection, new MongoNodeStore(db),
+                    new MongoGridFSBlobStore(db));
             GenericWriteTask task = new GenericWriteTask("mk-" + i, mk, diff, 10);
             executor.execute(task);
         }
@@ -51,8 +52,7 @@ public class ConcurrentWriteMultipleMkMongoTest extends BaseMongoMicroKernelTest
         executor.awaitTermination(10, TimeUnit.MINUTES);
     }
 
-    private StringBuilder buildPyramidDiff(String startingPoint,
-            int index, int numberOfChildren, long nodesNumber,
+    private StringBuilder buildPyramidDiff(String startingPoint, int index, int numberOfChildren, long nodesNumber,
             String nodePrefixName, StringBuilder diff) {
         if (numberOfChildren == 0) {
             for (long i = 0; i < nodesNumber; i++)
@@ -68,9 +68,8 @@ public class ConcurrentWriteMultipleMkMongoTest extends BaseMongoMicroKernelTest
         for (int i = 1; i <= numberOfChildren; i++) {
             if (!startingPoint.endsWith("/"))
                 startingPoint = startingPoint + "/";
-            buildPyramidDiff(startingPoint + nodePrefixName + index, index
-                    * numberOfChildren + i, numberOfChildren, nodesNumber,
-                    nodePrefixName, diff);
+            buildPyramidDiff(startingPoint + nodePrefixName + index, index * numberOfChildren + i, numberOfChildren,
+                    nodesNumber, nodePrefixName, diff);
         }
         return diff;
     }
@@ -88,13 +87,14 @@ public class ConcurrentWriteMultipleMkMongoTest extends BaseMongoMicroKernelTest
         private MicroKernel mk;
         private String diff;
         private int nodesPerCommit;
+        private Monitor commitMonitor;
 
-        public GenericWriteTask(String id, MongoMicroKernel mk, String diff,
-                int nodesPerCommit) {
+        public GenericWriteTask(String id, MongoMicroKernel mk, String diff, int nodesPerCommit) {
             this.id = id;
             this.mk = mk;
             this.diff = diff;
             this.nodesPerCommit = nodesPerCommit;
+            commitMonitor = MonitorFactory.getTimeMonitor("commit");
         }
 
         @Override
@@ -111,9 +111,14 @@ public class ConcurrentWriteMultipleMkMongoTest extends BaseMongoMicroKernelTest
                 currentCommit.append(diff);
                 i++;
                 if (i == nodesPerCommit) {
-                    //System.out.println("[" + id + "] Committing: " + currentCommit.toString());
-                    String rev = mk.commit("", currentCommit.toString(), null, null);
-                    //System.out.println("[" + id + "] Committed-" + rev + ":" + currentCommit.toString());
+                   
+                    commitMonitor.start();
+                    mk.commit("", currentCommit.toString(), null, null);
+                    commitMonitor.stop();
+                    
+                    if (commitMonitor.getLastValue() > 20000)
+                        System.out.println(commitMonitor.getLastValue());
+                    
                     currentCommit.setLength(0);
                     i = 0;
                 }
-- 
1.7.9.5

