Author: jukka
Date: Wed Mar 26 14:25:41 2014
New Revision: 1581861

URL: http://svn.apache.org/r1581861
Log:
OAK-1496: Benchmark for concurrent file writes.

Patch by Amit Jain

Added:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentFileWriteTest.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1581861&r1=1581860&r2=1581861&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 Wed Mar 26 14:25:41 2014
@@ -187,6 +187,7 @@ public class BenchmarkRunner {
             new SequentialCreateNodesTest(),
             new CreateManyIndexedNodesTest(),
             new GetPoliciesTest(),
+            new ConcurrentFileWriteTest(),
         };
 
         Set<String> argset = Sets.newHashSet(options.nonOptionArguments());

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentFileWriteTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentFileWriteTest.java?rev=1581861&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentFileWriteTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentFileWriteTest.java
 Wed Mar 26 14:25:41 2014
@@ -0,0 +1,177 @@
+/*
+ * 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.oak.benchmark;
+
+import java.util.Calendar;
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/**
+ * Test case that writes blobs concurrently and concurrently reads the blobs 
back when available.
+ */
+public class ConcurrentFileWriteTest extends AbstractTest {
+
+    private static final String NT_FOLDER = "nt:folder";
+    private static final String NT_FILE = "nt:file";
+    private static final String NT_RESOURCE = "nt:resource";
+    private static final String JCR_DATA = "jcr:data";
+    private static final String JCR_CONTENT = "jcr:content";
+    private static final String JCR_MIME_TYPE = "jcr:mimeType";
+    private static final String JCR_LAST_MOD = "jcr:lastModified";
+
+    private static final int FILE_SIZE = Integer.getInteger("fileSize", 1900);
+
+    private static final int FILE_COUNT = Integer.getInteger("fileCount", 10);
+
+    private static final int WRITERS = Integer.getInteger("fileWriters", 50);
+
+    private static final int READERS = Integer.getInteger("fileReaders", 50);
+
+    protected static final String ROOT_NODE_NAME = "concurrentFileWriteTest" + 
TEST_ID;
+
+    private Session session;
+
+    @Override
+    public void beforeTest() {
+        session = loginWriter();
+        try {
+            session.getRootNode().addNode(ROOT_NODE_NAME, NT_FOLDER);
+            session.save();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        // randomize the root folder for this run of the test
+        String runId = String.valueOf((new Random()).nextInt());
+        session.getRootNode().getNode(ROOT_NODE_NAME).addNode(runId, 
NT_FOLDER);
+        session.save();
+
+        CountDownLatch writersStopLatch = new CountDownLatch(WRITERS);
+        AtomicBoolean stopReadersFlag = new AtomicBoolean(false);
+
+        for (int i = 0; i < WRITERS; i++) {
+            Thread t = new Thread(new Writer(writersStopLatch, i, runId),
+                            "ConcurrentFileWriteTest-Writer-" + i);
+            t.start();
+        }
+
+        for (int i = 0; i < READERS; i++) {
+            Thread t = new Thread(new Reader(i, stopReadersFlag, runId),
+                            "ConcurrentFileWriteTest-Reader-" + i);
+            t.start();
+        }
+        writersStopLatch.await();
+        stopReadersFlag.set(true);
+    }
+
+    @Override
+    public void afterTest() throws RepositoryException {
+        session.refresh(true);
+        if (session.getRootNode().hasNode(ROOT_NODE_NAME)) {
+            session.getRootNode().getNode(ROOT_NODE_NAME).remove();
+        }
+        session.save();
+    }
+
+    class Reader implements Runnable {
+        private int id;
+        private Session session;
+        private AtomicBoolean stopFlag;
+        private String runId;
+
+        public Reader(int id, AtomicBoolean stopFlag, String runId) {
+            this.id = id;
+            session = loginWriter();
+            this.stopFlag = stopFlag;
+            this.runId = runId;
+        }
+
+        @Override
+        public void run() {
+            readFile();
+        }
+
+        private void readFile() {
+            for (int i = 0; i < FILE_COUNT && !stopFlag.get(); i++) {
+                try {
+                    Node fileRoot = 
session.getRootNode().getNode(ROOT_NODE_NAME);
+                    String fileid = "file" + id + "-" + i;
+
+                    while (!stopFlag.get() && !fileRoot.hasNode(fileid)) {
+                        Thread.sleep(50);
+                    }
+
+                    if (!stopFlag.get()) {
+                        
session.getRootNode().getNode(ROOT_NODE_NAME).getNode(runId).getNode(fileid)
+                                
.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    class Writer implements Runnable {
+        private Session session;
+        private CountDownLatch latch;
+        private int id;
+        private String runId;
+
+        public Writer(CountDownLatch stopLatch, int id, String runId) throws 
Exception {
+            latch = stopLatch;
+            session = loginWriter();
+            this.id = id;
+            this.runId = runId;
+        }
+
+        @Override
+        public void run() {
+            createFile();
+            latch.countDown();
+        }
+
+        @SuppressWarnings("deprecation")
+        private void createFile() {
+            for (int i = 0; i < FILE_COUNT; i++) {
+                try {
+                    session.refresh(false);
+
+                    Node file =
+                            
session.getRootNode().getNode(ROOT_NODE_NAME).getNode(runId)
+                                    .addNode("file" + id + "-" + i, NT_FILE);
+                    Node content = file.addNode(JCR_CONTENT, NT_RESOURCE);
+                    content.setProperty(JCR_MIME_TYPE, 
"application/octet-stream");
+                    content.setProperty(JCR_LAST_MOD, Calendar.getInstance());
+                    content.setProperty(JCR_DATA, new 
TestInputStream(FILE_SIZE * 1024));
+                    session.save();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+}

Propchange: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentFileWriteTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to