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 md...@apache.org on 2012/06/14 18:41:08 UTC

svn commit: r1350325 - in /jackrabbit/oak/trunk: ./ oak-bench/ oak-bench/base/ oak-bench/base/src/ oak-bench/base/src/main/ oak-bench/base/src/main/java/ oak-bench/base/src/main/java/org/ oak-bench/base/src/main/java/org/apache/ oak-bench/base/src/main...

Author: mduerig
Date: Thu Jun 14 16:41:06 2012
New Revision: 1350325

URL: http://svn.apache.org/viewvc?rev=1350325&view=rev
Log:
OAK-122: Performance test suite
Thanks to Michael Marth for the patch

Added:
    jackrabbit/oak/trunk/oak-bench/README.txt
    jackrabbit/oak/trunk/oak-bench/base/
    jackrabbit/oak/trunk/oak-bench/base/pom.xml
    jackrabbit/oak/trunk/oak-bench/base/src/
    jackrabbit/oak/trunk/oak-bench/base/src/main/
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadWriteTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/CreateManyChildNodesTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginLogoutTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ReadPropertyTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2DescendantSearchTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2SearchTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SetPropertyTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SimpleSearchTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileReadTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileWriteTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TestInputStream.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TransientManyChildNodesTest.java
    jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/UpdateManyChildNodesTest.java
    jackrabbit/oak/trunk/oak-bench/oak03/
    jackrabbit/oak/trunk/oak-bench/oak03/pom.xml
    jackrabbit/oak/trunk/oak-bench/oak03/src/
    jackrabbit/oak/trunk/oak-bench/oak03/src/test/
    jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/
    jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/
    jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/
    jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/jackrabbit/
    jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/jackrabbit/oak/
    jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/jackrabbit/oak/performance/
    jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/jackrabbit/oak/performance/PerformanceTest.java
    jackrabbit/oak/trunk/oak-bench/parent/
    jackrabbit/oak/trunk/oak-bench/parent/pom.xml
    jackrabbit/oak/trunk/oak-bench/plot.sh
Modified:
    jackrabbit/oak/trunk/oak-bench/pom.xml
    jackrabbit/oak/trunk/pom.xml

Added: jackrabbit/oak/trunk/oak-bench/README.txt
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/README.txt?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/README.txt (added)
+++ jackrabbit/oak/trunk/oak-bench/README.txt Thu Jun 14 16:41:06 2012
@@ -0,0 +1,85 @@
+---------------------------------
+Oak Performance Test Suite
+---------------------------------
+
+This directory contains a simple performance test suite that can be
+extended for ongoing Oak versions and micro kernels. Use the following
+command to run this test suite:
+
+    mvn clean install
+
+Note that the test suite will take more than an hour to complete, and to
+avoid distorting the results you should avoid putting any extra load on
+the computer while the test suite is running.
+
+The results are stored as oak*/target/*.txt report files and can
+be combined into an HTML report by running the following command on a
+(Unix) system where gnuplot is installed.
+
+    sh plot.sh
+
+Mac OS X note : if you want to execute the above script, you will need
+to install gnuplot and imagemagick2-svg from the Fink project. For
+more information : http://finkproject.org 
+
+Selecting which tests to run
+----------------------------
+
+The -Donly command line parameter allows you to specify a regexp for
+selecting which performance test cases to run. To run a single test
+case, use a command like this:
+
+    mvn clean install -Donly=ConcurrentReadTest
+
+To run all concurrency tests, use:
+
+    mvn clean install -Donly=Concurrent.*Test
+
+Selecting which micro kernel to test
+----------------------------------------------------------
+
+The -Dmk command line parameter allows you to specify a regexp for
+selecting the micro kernel and configurations against which the
+performance tests are run. The default setting selects only the default
+micro kernel:
+
+    mvn clean install -Dmk=\d\.\d
+
+To run the tests against all included configurations, use:
+
+    mvn clean install -Dmk=.*
+
+Using a profiler
+----------------
+
+To enable a profiler, use the -Dagentlib= command line pameter:
+
+    mvn clean install -Dagentlib=hprof=cpu=samples,depth=10
+
+Adding a new performance test
+-----------------------------
+
+The tests run by this performance test suite are listed in the
+testPerformance() method of the AbstractPerformanceTest class in
+the org.apache.jackrabbit.oak.performance package of the oak-perf-base
+component that you can find in the ./base directory.
+
+Each test is a subclass of the AbstractTest class in that same package,
+and you need to implement at least the abstract runTest() method when
+creating a new test. The runTest() method should contain the code whose
+performance you want to measure. For best measurement results the method
+should normally take something between 0.1 to 10 seconds to execute, so
+you may need to add a constant-size loop around your code like is done
+for example in the LoginTest class. The test suite compares relative
+performance between different Oak versions, so the absolute time
+taken by the test method is irrelevant.
+
+Many performance tests need some setup and teardown code for things like
+building the content tree against which the test is being run. Such work
+should not be included in the runTest() method to prevent affecting the
+performance measurements. Instead you can override the before/afterTest()
+and before/afterSuite() methods that get called respectively before and
+after each individual test iteration and the entire test suite. See for
+example the SetPropertyTest class for an example of how these methods
+are best used.
+

Added: jackrabbit/oak/trunk/oak-bench/base/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/pom.xml?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/pom.xml (added)
+++ jackrabbit/oak/trunk/oak-bench/base/pom.xml Thu Jun 14 16:41:06 2012
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                             http://maven.apache.org/maven-v4_0_0.xsd ">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.jackrabbit.oak</groupId>
+    <artifactId>oak-perf-parent</artifactId>
+    <version>0.3-SNAPSHOT</version>
+    <relativePath>../parent/pom.xml</relativePath>
+  </parent>
+
+  <artifactId>oak-perf-base</artifactId>
+  <name>Oak Performance Test Utilities</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-math</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>oak-jcr</artifactId>
+      <version>0.3-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <!--  dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-core</artifactId>
+      <version>1.6.2</version --> <!-- overridden by downstream projects -->
+      <!-- scope>provided</scope>
+    </dependency -->
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>1.4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.5.8</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-nop</artifactId>
+      <version>1.5.8</version>
+    </dependency>
+    <dependency>
+      <groupId>org.testng</groupId>
+      <artifactId>testng</artifactId>
+      <classifier>jdk15</classifier>
+      <version>5.8</version>
+    </dependency>
+  </dependencies>
+
+</project>
+

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractPerformanceTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,145 @@
+/*
+ * 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.performance;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.regex.Pattern;
+
+import javax.jcr.Credentials;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.SimpleCredentials;
+
+import org.apache.commons.io.output.FileWriterWithEncoding;
+import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
+import org.apache.jackrabbit.oak.jcr.RepositoryImpl;
+
+public abstract class AbstractPerformanceTest {
+
+	private final int warmup = 1;
+
+	private final int runtime = 10;
+
+	private final Credentials credentials = new SimpleCredentials("admin",
+			"admin".toCharArray());
+
+	private final Pattern microKernelPattern = Pattern.compile(System
+			.getProperty("mk", ".*"));
+	private final Pattern testPattern = Pattern.compile(System.getProperty(
+			"only", ".*"));
+
+	protected void testPerformance(String name, String microKernel)
+			throws Exception {
+
+		runTest(new LoginTest(), name, microKernel);
+		runTest(new LoginLogoutTest(), name, microKernel);
+		runTest(new ReadPropertyTest(), name, microKernel);
+		runTest(new SetPropertyTest(), name, microKernel);
+		runTest(new SmallFileReadTest(), name, microKernel);
+		runTest(new SmallFileWriteTest(), name, microKernel);
+		runTest(new ConcurrentReadTest(), name, microKernel);
+        runTest(new ConcurrentReadWriteTest(), name, microKernel);
+		runTest(new SimpleSearchTest(), name, microKernel);
+		runTest(new SQL2SearchTest(), name, microKernel);
+		runTest(new DescendantSearchTest(), name, microKernel);
+		runTest(new SQL2DescendantSearchTest(), name, microKernel);
+		runTest(new CreateManyChildNodesTest(), name, microKernel);
+		runTest(new UpdateManyChildNodesTest(), name, microKernel);
+		runTest(new TransientManyChildNodesTest(), name, microKernel);
+
+	}
+
+	private void runTest(AbstractTest test, String name, String microKernel) {
+		if (microKernelPattern.matcher(microKernel).matches()
+				&& testPattern.matcher(test.toString()).matches()) {
+
+			RepositoryImpl repository;
+			try {
+				repository = createRepository(microKernel);
+
+				// Run the test
+				DescriptiveStatistics statistics = runTest(test, repository);
+				if (statistics.getN() > 0) {
+					writeReport(test.toString(), name, microKernel, statistics);
+				}
+			} catch (RepositoryException re) {
+				re.printStackTrace();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private DescriptiveStatistics runTest(AbstractTest test,
+			Repository repository) throws Exception {
+		DescriptiveStatistics statistics = new DescriptiveStatistics();
+
+		test.setUp(repository, credentials);
+		try {
+			// Run a few iterations to warm up the system
+			long warmupEnd = System.currentTimeMillis() + warmup * 1000;
+			while (System.currentTimeMillis() < warmupEnd) {
+				test.execute();
+			}
+
+			// Run test iterations, and capture the execution times
+			long runtimeEnd = System.currentTimeMillis() + runtime * 1000;
+			while (System.currentTimeMillis() < runtimeEnd) {
+				statistics.addValue(test.execute());
+			}
+		} finally {
+			test.tearDown();
+		}
+
+		return statistics;
+	}
+
+	private static void writeReport(String test, String name, String microKernel,
+            DescriptiveStatistics statistics) throws IOException {
+		File report = new File("target", test + "-" + microKernel + ".txt");
+
+		boolean needsPrefix = !report.exists();
+		PrintWriter writer = new PrintWriter(new FileWriterWithEncoding(report,
+				"UTF-8", true));
+		try {
+			if (needsPrefix) {
+				writer.format(
+						"# %-34.34s     min     10%%     50%%     90%%     max%n",
+						test);
+			}
+
+			writer.format("%-36.36s  %6.0f  %6.0f  %6.0f  %6.0f  %6.0f%n",
+					name, statistics.getMin(), statistics.getPercentile(10.0),
+					statistics.getPercentile(50.0),
+					statistics.getPercentile(90.0), statistics.getMax());
+		} finally {
+			writer.close();
+		}
+	}
+
+	protected RepositoryImpl createRepository(String microKernel)
+			throws RepositoryException {
+
+		// TODO: depending on the microKernel string a particular repository
+		// with that MK must be returned
+
+		return new RepositoryImpl();
+	}
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/AbstractTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,213 @@
+/*
+ * 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.performance;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.jcr.Credentials;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/**
+ * Abstract base class for individual performance benchmarks.
+ */
+public abstract class AbstractTest {
+
+    private Repository repository;
+
+    private Credentials credentials;
+
+    private List<Session> sessions;
+
+    private List<Thread> threads;
+
+    private volatile boolean running;
+
+    protected static int getScale(int def) {
+        int scale = Integer.getInteger("scale", 0);
+        if (scale == 0) {
+            scale = def;
+        }
+        return scale;
+    }
+
+    /**
+     * Prepares this performance benchmark.
+     *
+     * @param repository the repository to use
+     * @param credentials credentials of a user with write access
+     * @throws Exception if the benchmark can not be prepared
+     */
+    public void setUp(Repository repository, Credentials credentials)
+            throws Exception {
+        this.repository = repository;
+        this.credentials = credentials;
+        this.sessions = new LinkedList<Session>();
+        this.threads = new LinkedList<Thread>();
+
+        this.running = true;
+
+        beforeSuite();
+    }
+
+    /**
+     * Executes a single iteration of this test.
+     *
+     * @return number of milliseconds spent in this iteration
+     * @throws Exception if an error occurs
+     */
+    public long execute() throws Exception {
+        beforeTest();
+        try {
+            long start = System.currentTimeMillis();
+            runTest();
+            return System.currentTimeMillis() - start;
+        } finally {
+            afterTest();
+        }
+    }
+    /**
+     * Cleans up after this performance benchmark.
+     *
+     * @throws Exception if the benchmark can not be cleaned up
+     */
+    public void tearDown() throws Exception {
+        this.running = false;
+        for (Thread thread : threads) {
+            thread.join();
+        }
+
+        afterSuite();
+
+        for (Session session : sessions) {
+            if (session.isLive()) {
+                session.logout();
+            }
+        }
+
+        this.threads = null;
+        this.sessions = null;
+        this.credentials = null;
+        this.repository = null;
+    }
+
+    /**
+     * Run before any iterations of this test get executed. Subclasses can
+     * override this method to set up static test content.
+     *
+     * @throws Exception if an error occurs
+     */
+    protected void beforeSuite() throws Exception {
+    }
+
+    protected void beforeTest() throws Exception {
+    }
+
+    protected abstract void runTest() throws Exception;
+
+    protected void afterTest() throws Exception {
+    }
+
+    /**
+     * Run after all iterations of this test have been executed. Subclasses can
+     * override this method to clean up static test content.
+     *
+     * @throws Exception if an error occurs
+     */
+    protected void afterSuite() throws Exception {
+    }
+
+    protected void failOnRepositoryVersions(String... versions)
+            throws RepositoryException {
+        String repositoryVersion =
+                repository.getDescriptor(Repository.REP_VERSION_DESC);
+        for (String version : versions) {
+            if (repositoryVersion.startsWith(version)) {
+                throw new RepositoryException(
+                        "Unable to run " + getClass().getName()
+                        + " on repository version " + version);
+            }
+        }
+    }
+
+    protected Repository getRepository() {
+        return repository;
+    }
+
+    protected Credentials getCredentials() {
+        return credentials;
+    }
+
+    /**
+     * Returns a new reader session that will be automatically closed once
+     * all the iterations of this test have been executed.
+     *
+     * @return reader session
+     */
+    protected Session loginReader() {
+        try {
+            Session session = repository.login();
+            sessions.add(session);
+            return session;
+        } catch (RepositoryException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Returns a new writer session that will be automatically closed once
+     * all the iterations of this test have been executed.
+     *
+     * @return writer session
+     */
+    protected Session loginWriter() {
+        try {
+            Session session = repository.login(credentials);
+            sessions.add(session);
+            return session;
+        } catch (RepositoryException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Adds a background thread that repeatedly executes the given job
+     * until all the iterations of this test have been executed.
+     *
+     * @param job background job
+     */
+    protected void addBackgroundJob(final Runnable job) {
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                while (running) {
+                    job.run();
+                }
+            }
+        };
+        thread.start();
+        threads.add(thread);
+    }
+
+    public String toString() {
+        String name = getClass().getName();
+        return name.substring(name.lastIndexOf('.') + 1);
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,99 @@
+/*
+ * 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.performance;
+
+import java.util.Random;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+/**
+ * Test case that traverses 10k unstructured nodes (100x100) while 50 concurrent
+ * readers randomly access nodes from within this tree.
+ */
+public class ConcurrentReadTest extends AbstractTest {
+
+	protected static final int NODE_COUNT = 100;
+
+	private static final int READER_COUNT = getScale(20);
+
+	private Session session;
+
+	protected Node root;
+
+	@Override
+    public void beforeSuite() throws Exception {
+		session = getRepository().login(
+				new SimpleCredentials("admin", "admin".toCharArray()));
+		root = session.getRootNode().addNode("testroot", "nt:unstructured");
+		for (int i = 0; i < NODE_COUNT; i++) {
+			Node node = root.addNode("node" + i, "nt:unstructured");
+			for (int j = 0; j < NODE_COUNT; j++) {
+				node.addNode("node" + j, "nt:unstructured");
+			}
+			session.save();
+		}
+
+		for (int i = 0; i < READER_COUNT; i++) {
+			addBackgroundJob(new Reader());
+		}
+	}
+
+	private class Reader implements Runnable {
+
+		private Session session;
+
+		private final Random random = new Random();
+
+		public void run() {
+
+			try {
+				session = getRepository().login(
+						new SimpleCredentials("admin", "admin".toCharArray()));
+				int i = random.nextInt(NODE_COUNT);
+				int j = random.nextInt(NODE_COUNT);
+				session.getRootNode()
+						.getNode("testroot/node" + i + "/node" + j);
+			} catch (RepositoryException e) {
+				throw new RuntimeException(e);
+			}
+		}
+
+	}
+
+	@Override
+    public void runTest() throws Exception {
+		Reader reader = new Reader();
+		for (int i = 0; i < 1000; i++) {
+			reader.run();
+		}
+	}
+
+	@Override
+    public void afterSuite() throws Exception {
+		for (int i = 0; i < NODE_COUNT; i++) {
+			root.getNode("node" + i).remove();
+			session.save();
+		}
+
+		root.remove();
+		session.save();
+	}
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadWriteTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadWriteTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadWriteTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ConcurrentReadWriteTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,64 @@
+/*
+ * 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.performance;
+
+import java.util.Random;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+/**
+ * A {@link ConcurrentReadTest} with a single writer thread that continuously
+ * updates the nodes being accessed by the readers.
+ */
+public class ConcurrentReadWriteTest extends ConcurrentReadTest {
+
+    @Override
+    public void beforeSuite() throws Exception {
+        super.beforeSuite();
+
+        addBackgroundJob(new Writer());
+    }
+
+    private class Writer implements Runnable {
+
+        private Session session;
+
+        private final Random random = new Random();
+
+        private long count;
+
+        public void run() {
+            try {
+            	session = getRepository().login(
+        				new SimpleCredentials("admin", "admin".toCharArray()));
+                int i = random.nextInt(NODE_COUNT);
+                int j = random.nextInt(NODE_COUNT);
+                Node node = session.getRootNode().getNode(
+                        "testroot/node" + i + "/node" + j);
+                node.setProperty("count", count++);
+                session.save();
+            } catch (RepositoryException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/CreateManyChildNodesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/CreateManyChildNodesTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/CreateManyChildNodesTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/CreateManyChildNodesTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,57 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/**
+ * Test for measuring the performance of creating a node with
+ * {@value #CHILD_COUNT} child nodes.
+ */
+public class CreateManyChildNodesTest extends AbstractTest {
+
+    private static final int CHILD_COUNT = 10 * 1000;
+
+    private Session session;
+
+    @Override
+    public void beforeSuite() throws RepositoryException {
+        session = loginWriter();
+    }
+
+    @Override
+    public void beforeTest() throws RepositoryException {
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        Node node = session.getRootNode().addNode("testnode", "nt:unstructured");
+        for (int i = 0; i < CHILD_COUNT; i++) {
+            node.addNode("node" + i, "nt:unstructured");
+        }
+        session.save();
+    }
+
+    @Override
+    public void afterTest() throws RepositoryException {
+        session.getRootNode().getNode("testnode").remove();
+        session.save();
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/DescendantSearchTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,84 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+
+/**
+ * Performance test to check performance of queries on sub-trees.
+ */
+public class DescendantSearchTest extends AbstractTest {
+
+    private static final int NODE_COUNT = 100;
+
+    private Session session;
+
+    private Node root;
+
+    protected Query createQuery(QueryManager manager, int i)
+            throws RepositoryException {
+        return manager.createQuery("/jcr:root/testroot//element(*,nt:base)[@testcount=" + i + "]", Query.XPATH);
+    }
+
+    @Override
+    public void beforeSuite() throws RepositoryException {
+        session = getRepository().login(getCredentials());
+
+        root = session.getRootNode().addNode("testroot", "nt:unstructured");
+        for (int i = 0; i < NODE_COUNT; i++) {
+            Node node = root.addNode("node" + i, "nt:unstructured");
+            for (int j = 0; j < NODE_COUNT; j++) {
+                Node child = node.addNode("node" + j, "nt:unstructured");
+                child.setProperty("testcount", j);
+            }
+            session.save();
+        }
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        QueryManager manager = session.getWorkspace().getQueryManager();
+        for (int i = 0; i < NODE_COUNT; i++) {
+            Query query = createQuery(manager, i);
+            NodeIterator iterator = query.execute().getNodes();
+            while (iterator.hasNext()) {
+                Node node = iterator.nextNode();
+                if (node.getProperty("testcount").getLong() != i) {
+                    throw new Exception("Invalid test result: " + node.getPath());
+                }
+            }
+        }
+    }
+
+    @Override
+    public void afterSuite() throws RepositoryException {
+        for (int i = 0; i < NODE_COUNT; i++) {
+            root.getNode("node" + i).remove();
+            session.save();
+        }
+
+        root.remove();
+        session.save();
+        session.logout();
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginLogoutTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginLogoutTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginLogoutTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginLogoutTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,47 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Credentials;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+public class LoginLogoutTest extends AbstractTest {
+
+	@Override
+	public void setUp(Repository repository, Credentials credentials)
+			throws Exception {
+		super.setUp(repository,
+				new SimpleCredentials("admin", "admin".toCharArray()));
+	}
+	
+    @Override
+    public void runTest() throws RepositoryException {
+        Repository repository = getRepository();
+        for (int i = 0; i < 1000; i++) {
+            Session session = repository.login(getCredentials());
+            try {
+                session.getRootNode();
+            } finally {
+                session.logout();
+            }
+        }
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/LoginTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,51 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Credentials;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+public class LoginTest extends AbstractTest {
+
+	private final Session[] sessions = new Session[1000];
+
+	@Override
+	public void setUp(Repository repository, Credentials credentials)
+			throws Exception {
+		super.setUp(repository,
+				new SimpleCredentials("admin", "admin".toCharArray()));
+	}
+
+	@Override
+    public void runTest() throws RepositoryException {
+		for (int i = 0; i < sessions.length; i++) {
+			sessions[i] = getRepository().login(getCredentials(), "default");
+		}
+
+	}
+
+	@Override
+    public void afterTest() throws RepositoryException {
+        for (Session session : sessions) {
+            session.logout();
+        }
+	}
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ReadPropertyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ReadPropertyTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ReadPropertyTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/ReadPropertyTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,57 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Node;
+import javax.jcr.Session;
+
+/**
+ * {@code ReadPropertyTest} implements a performance test, which reads
+ * three properties: one with a jcr prefix, one with the empty prefix and a
+ * third one, which does not exist.
+ */
+public class ReadPropertyTest extends AbstractTest {
+
+    private Session session;
+
+    private Node root;
+
+    @Override
+    protected void beforeSuite() throws Exception {
+        session = getRepository().login(getCredentials());
+        root = session.getRootNode().addNode(
+                getClass().getSimpleName(), "nt:unstructured");
+        root.setProperty("property", "value");
+        session.save();
+    }
+
+    @Override
+    protected void runTest() throws Exception {
+        for (int i = 0; i < 10000; i++) {
+            root.getProperty("jcr:primaryType");
+            root.getProperty("property");
+            root.hasProperty("does-not-exist");
+        }
+    }
+
+    @Override
+    protected void afterSuite() throws Exception {
+        root.remove();
+        session.save();
+        session.logout();
+    }
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2DescendantSearchTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2DescendantSearchTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2DescendantSearchTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2DescendantSearchTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,36 @@
+/*
+ * 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.performance;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+
+/**
+ * SQL-2 version of the sub-tree performance test.
+ */
+public class SQL2DescendantSearchTest extends DescendantSearchTest {
+
+    @Override
+    protected Query createQuery(QueryManager manager, int i)
+            throws RepositoryException {
+        return manager.createQuery(
+                "SELECT * FROM [nt:base] AS n WHERE ISDESCENDANTNODE(n, '/testroot') AND testcount=" + i,
+                "JCR-SQL2");
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2SearchTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2SearchTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2SearchTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SQL2SearchTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,33 @@
+/*
+ * 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.performance;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+
+public class SQL2SearchTest extends SimpleSearchTest {
+
+    @Override
+    protected Query createQuery(QueryManager manager, int i)
+            throws RepositoryException {
+        return manager.createQuery(
+                "SELECT * FROM [nt:base] WHERE testcount=" + i,
+                "JCR-SQL2");
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SetPropertyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SetPropertyTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SetPropertyTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SetPropertyTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,65 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/**
+ * Test for measuring the performance of setting a single property and
+ * saving the change.
+ */
+public class SetPropertyTest extends AbstractTest {
+
+    private Session session;
+
+    private Node node;
+
+    @Override
+    public void beforeSuite() throws RepositoryException {
+        session = getRepository().login(getCredentials());
+        node = session.getRootNode().addNode("testnode", "nt:unstructured");
+        session.save();
+    }
+
+    @Override
+    public void beforeTest() throws RepositoryException {
+        node.setProperty("count", -1);
+        session.save();
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        for (int i = 0; i < 1000; i++) {
+            node.setProperty("count", i);
+            session.save();
+        }
+    }
+
+    @Override
+    public void afterTest() throws RepositoryException {
+    }
+
+    @Override
+    public void afterSuite() throws RepositoryException {
+        session.getRootNode().getNode("testnode").remove();
+        session.save();
+        session.logout();
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SimpleSearchTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SimpleSearchTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SimpleSearchTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SimpleSearchTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,81 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+
+public class SimpleSearchTest extends AbstractTest {
+
+    private static final int NODE_COUNT = 100;
+
+    private Session session;
+
+    private Node root;
+
+    protected Query createQuery(QueryManager manager, int i)
+            throws RepositoryException {
+        return manager.createQuery("//*[@testcount=" + i + "]", Query.XPATH);
+    }
+
+    @Override
+    public void beforeSuite() throws RepositoryException {
+        session = getRepository().login(getCredentials());
+
+        root = session.getRootNode().addNode("testroot", "nt:unstructured");
+        for (int i = 0; i < NODE_COUNT; i++) {
+            Node node = root.addNode("node" + i, "nt:unstructured");
+            for (int j = 0; j < NODE_COUNT; j++) {
+                Node child = node.addNode("node" + j, "nt:unstructured");
+                child.setProperty("testcount", j);
+            }
+            session.save();
+        }
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        QueryManager manager = session.getWorkspace().getQueryManager();
+        for (int i = 0; i < NODE_COUNT; i++) {
+            Query query = createQuery(manager, i);
+            NodeIterator iterator = query.execute().getNodes();
+            while (iterator.hasNext()) {
+                Node node = iterator.nextNode();
+                if (node.getProperty("testcount").getLong() != i) {
+                    throw new Exception("Invalid test result: " + node.getPath());
+                }
+            }
+        }
+    }
+
+    @Override
+    public void afterSuite() throws RepositoryException {
+        for (int i = 0; i < NODE_COUNT; i++) {
+            root.getNode("node" + i).remove();
+            session.save();
+        }
+
+        root.remove();
+        session.save();
+        session.logout();
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileReadTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileReadTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileReadTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileReadTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,77 @@
+/*
+ * 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.performance;
+
+import java.io.InputStream;
+import java.util.Calendar;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.output.NullOutputStream;
+
+public class SmallFileReadTest extends AbstractTest {
+
+    private static final int FILE_COUNT = 1000;
+
+    private static final int FILE_SIZE = 10;
+
+    private Session session;
+
+    private Node root;
+
+    @Override
+    public void beforeSuite() throws RepositoryException {
+        session = getRepository().login(getCredentials());
+
+        root = session.getRootNode().addNode(
+                "SmallFileReadTest", "nt:folder");
+        for (int i = 0; i < FILE_COUNT; i++) {
+            Node file = root.addNode("file" + i, "nt:file");
+            Node content = file.addNode("jcr:content", "nt:resource");
+            content.setProperty("jcr:mimeType", "application/octet-stream");
+            content.setProperty("jcr:lastModified", Calendar.getInstance());
+            content.setProperty(
+                    "jcr:data", new TestInputStream(FILE_SIZE * 1024));
+        }
+        session.save();
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        for (int i = 0; i < FILE_COUNT; i++) {
+            Node file = root.getNode("file" + i);
+            Node content = file.getNode("jcr:content");
+            InputStream stream = content.getProperty("jcr:data").getStream();
+            try {
+                IOUtils.copy(stream, new NullOutputStream());
+            } finally {
+                stream.close();
+            }
+        }
+    }
+
+    @Override
+    public void afterSuite() throws RepositoryException {
+        root.remove();
+        session.save();
+        session.logout();
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileWriteTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileWriteTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileWriteTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/SmallFileWriteTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,65 @@
+/*
+ * 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.performance;
+
+import java.util.Calendar;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+public class SmallFileWriteTest extends AbstractTest {
+
+    private static final int FILE_COUNT = 100;
+
+    private static final int FILE_SIZE = 10;
+
+    private Session session;
+
+    private Node root;
+
+    @Override
+    public void beforeSuite() throws RepositoryException {
+        session = loginWriter();
+    }
+
+    @Override
+    public void beforeTest() throws RepositoryException {
+        root = session.getRootNode().addNode("SmallFileWriteTest", "nt:folder");
+        session.save();
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        for (int i = 0; i < FILE_COUNT; i++) {
+            Node file = root.addNode("file" + i, "nt:file");
+            Node content = file.addNode("jcr:content", "nt:resource");
+            content.setProperty("jcr:mimeType", "application/octet-stream");
+            content.setProperty("jcr:lastModified", Calendar.getInstance());
+            content.setProperty(
+                    "jcr:data", new TestInputStream(FILE_SIZE * 1024));
+        }
+        session.save();
+    }
+
+    @Override
+    public void afterTest() throws RepositoryException {
+        root.remove();
+        session.save();
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TestInputStream.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TestInputStream.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TestInputStream.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TestInputStream.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,71 @@
+/*
+ * 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.performance;
+
+import java.io.InputStream;
+import java.util.Random;
+
+/**
+ * An input stream that returns a given number of dummy data. The returned
+ * data is designed to be non-compressible to prevent possible compression
+ * mechanisms from affecting performance measurements.
+ */
+class TestInputStream extends InputStream {
+
+    private final int n;
+
+    private int i;
+
+    /**
+     * Source of the random stream of bytes. No fixed seed is used to
+     * prevent a solution like the Jackrabbit data store from using just
+     * a single storage location for multiple streams.
+     */
+    private final Random random = new Random();
+
+    public TestInputStream(int length) {
+        n = length;
+        i = 0;
+    }
+
+    @Override
+    public int read() {
+        if (i < n) {
+            i++;
+            byte[] b = new byte[1];
+            random.nextBytes(b);
+            return b[0];
+        } else {
+            return -1;
+        }
+    }
+
+    @Override
+    public int read(byte[] b, int off, int len) {
+        if (i < n) {
+            byte[] data = new byte[Math.min(len, n - i)];
+            random.nextBytes(data);
+            System.arraycopy(data, 0, b, off, data.length);
+            i += data.length;
+            return data.length;
+        } else {
+            return -1;
+        }
+    }
+
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TransientManyChildNodesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TransientManyChildNodesTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TransientManyChildNodesTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/TransientManyChildNodesTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,69 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/**
+ * Test for measuring the performance of {@value #ITERATIONS} iterations of
+ * transiently adding and removing a child node to a node that already has
+ * {@value #CHILD_COUNT} existing child nodes.
+ */
+public class TransientManyChildNodesTest extends AbstractTest {
+
+    private static final int CHILD_COUNT = 10 * 1000;
+
+    private static final int ITERATIONS = 1000;
+
+    private Session session;
+
+    private Node node;
+
+    @Override
+    public void beforeSuite() throws RepositoryException {
+        session = getRepository().login(getCredentials());
+        node = session.getRootNode().addNode("testnode", "nt:unstructured");
+        for (int i = 0; i < CHILD_COUNT; i++) {
+            node.addNode("node" + i, "nt:unstructured");
+        }
+    }
+
+    @Override
+    public void beforeTest() throws RepositoryException {
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        for (int i = 0; i < ITERATIONS; i++) {
+            node.addNode("onemore", "nt:unstructured").remove();
+        }
+    }
+
+    @Override
+    public void afterTest() throws RepositoryException {
+    }
+
+    @Override
+    public void afterSuite() throws RepositoryException {
+        session.getRootNode().getNode("testnode").remove();
+        session.save();
+        session.logout();
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/UpdateManyChildNodesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/UpdateManyChildNodesTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/UpdateManyChildNodesTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/base/src/main/java/org/apache/jackrabbit/oak/performance/UpdateManyChildNodesTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,67 @@
+/*
+ * 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.performance;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/**
+ * Test for measuring the performance of adding one extra child node to 
+ * node with {@value #CHILD_COUNT} existing child nodes.
+ */
+public class UpdateManyChildNodesTest extends AbstractTest {
+
+    private static final int CHILD_COUNT = 10 * 1000;
+
+    private Session session;
+
+    private Node node;
+
+    @Override
+    public void beforeSuite() throws RepositoryException {
+        session = getRepository().login(getCredentials());
+        node = session.getRootNode().addNode("testnode", "nt:unstructured");
+        for (int i = 0; i < CHILD_COUNT; i++) {
+            node.addNode("node" + i, "nt:unstructured");
+        }
+    }
+
+    @Override
+    public void beforeTest() throws RepositoryException {
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        node.addNode("onemore", "nt:unstructured");
+        session.save();
+    }
+
+    @Override
+    public void afterTest() throws RepositoryException {
+        node.getNode("onemore").remove();
+        session.save();
+    }
+
+    @Override
+    public void afterSuite() throws RepositoryException {
+        session.getRootNode().getNode("testnode").remove();
+        session.save();
+        session.logout();
+    }
+
+}

Added: jackrabbit/oak/trunk/oak-bench/oak03/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/oak03/pom.xml?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/oak03/pom.xml (added)
+++ jackrabbit/oak/trunk/oak-bench/oak03/pom.xml Thu Jun 14 16:41:06 2012
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                             http://maven.apache.org/maven-v4_0_0.xsd ">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.jackrabbit.oak</groupId>
+    <artifactId>oak-perf-parent</artifactId>
+    <version>0.3-SNAPSHOT</version>
+    <relativePath>../parent/pom.xml</relativePath>
+  </parent>
+
+  <artifactId>oak-perf-oak03</artifactId>
+  <name>Oak 0.3 Performance Test</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.jackrabbit.oak</groupId>
+      <artifactId>oak-perf-base</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>javax.jcr</groupId>
+      <artifactId>jcr</artifactId>
+      <version>2.0</version>
+      <scope>test</scope>
+    </dependency>
+	<dependency>
+		<groupId>org.apache.jackrabbit</groupId>
+		<artifactId>oak-jcr</artifactId>
+		<version>0.3-SNAPSHOT</version>
+		<scope>provided</scope>
+		</dependency>
+    <!-- dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-core</artifactId>
+      <version>2.4-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency  -->
+  </dependencies>
+
+</project>
+

Added: jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/jackrabbit/oak/performance/PerformanceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/jackrabbit/oak/performance/PerformanceTest.java?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/jackrabbit/oak/performance/PerformanceTest.java (added)
+++ jackrabbit/oak/trunk/oak-bench/oak03/src/test/java/org/apache/jackrabbit/oak/performance/PerformanceTest.java Thu Jun 14 16:41:06 2012
@@ -0,0 +1,28 @@
+/*
+ * 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.performance;
+
+import org.testng.annotations.Test;
+
+public class PerformanceTest extends AbstractPerformanceTest {
+
+    @Test
+    public void testPerformance() throws Exception {
+        testPerformance("0.3", "default");
+        testPerformance("0.3", "other_mk");
+    }
+}

Added: jackrabbit/oak/trunk/oak-bench/parent/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/parent/pom.xml?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/parent/pom.xml (added)
+++ jackrabbit/oak/trunk/oak-bench/parent/pom.xml Thu Jun 14 16:41:06 2012
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+   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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                             http://maven.apache.org/maven-v4_0_0.xsd ">
+  <modelVersion>4.0.0</modelVersion>
+
+  <!-- =================================================================== -->
+  <!-- P R O J E C T  D E S C R I P T I O N                                -->
+  <!-- =================================================================== -->
+
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>10</version>
+    <relativePath />
+  </parent>
+
+  <groupId>org.apache.jackrabbit.oak</groupId>
+  <artifactId>oak-perf-parent</artifactId>
+  <name>Oak Performance Test Parent</name>
+  <version>0.3-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <properties>
+    <repo>\d\.\d</repo>
+    <only>.*</only>
+    <scale>0</scale>
+  </properties>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <configuration>
+            <source>1.5</source>
+            <target>1.5</target>
+          </configuration>
+        </plugin>
+        <plugin>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <configuration>
+			<argLine>-Xms256m -Xmx512m</argLine>
+            <enableAssertions>false</enableAssertions>
+            <systemProperties>
+              <property>
+                <name>derby.stream.error.file</name>
+                <value>target/derby.log</value>
+              </property>
+              <property>
+                <name>repo</name>
+                <value>${repo}</value>
+              </property>
+              <property>
+                <name>only</name>
+                <value>${only}</value>
+              </property>
+              <property>
+                <name>scale</name>
+                <value>${scale}</value>
+              </property>
+            </systemProperties>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>profiler</id>
+      <activation>
+        <property>
+          <name>agentlib</name>
+        </property>
+      </activation>
+      <build>
+        <pluginManagement>
+          <plugins>
+            <plugin>
+              <artifactId>maven-surefire-plugin</artifactId>
+              <configuration>
+				<argLine>-Xmx512m -XX:MaxPermSize=512m -agentlib:${agentlib}</argLine>
+              </configuration>
+            </plugin>
+          </plugins>
+        </pluginManagement>
+      </build>
+    </profile>
+  </profiles>
+
+</project>

Added: jackrabbit/oak/trunk/oak-bench/plot.sh
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/plot.sh?rev=1350325&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/plot.sh (added)
+++ jackrabbit/oak/trunk/oak-bench/plot.sh Thu Jun 14 16:41:06 2012
@@ -0,0 +1,61 @@
+#!/bin/sh
+# 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.
+
+# This is an example Gnuplot script for plotting the performance results
+# produced by the Jackrabbit performance test suite. Before you run this
+# script you need to preprocess the individual performance reports.
+
+cat <<HTML >target/report.html
+<html>
+  <head>
+    <title>Jackrabbit performance</title>
+  </head>
+  <body>
+    <h1>Jackrabbit performance</h1>
+    <p>
+HTML
+
+for dat in */target/*.txt; do
+    cat "$dat" >>target/`basename "$dat"`
+done
+
+for dat in target/*.txt; do
+    name=`basename "$dat" .txt`
+    rows=`grep -v "#" "$dat" | wc -l`
+    gnuplot <<PLOT
+set term svg
+set xlabel "Jackrabbit version"
+set xrange [-1:$rows]
+set ylabel "Time (ms)"
+set yrange [0:]
+set output "target/$name.svg"
+set title "$name"
+plot "$dat" using 0:4:3:5:xtic(1) with yerrorlines notitle
+PLOT
+    convert "target/$name.svg" "target/$name.png"
+    cat <<HTML >>target/report.html
+      <img src="$name.png" alt="$name">
+HTML
+done
+
+cat <<HTML >>target/report.html
+    </p>
+  </body>
+</html>
+HTML
+
+echo file://`pwd`/target/report.html
+

Modified: jackrabbit/oak/trunk/oak-bench/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-bench/pom.xml?rev=1350325&r1=1350324&r2=1350325&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-bench/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-bench/pom.xml Thu Jun 14 16:41:06 2012
@@ -17,21 +17,31 @@
    limitations under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd ">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                             http://maven.apache.org/maven-v4_0_0.xsd ">
   <modelVersion>4.0.0</modelVersion>
 
+  <!-- =================================================================== -->
+  <!-- P R O J E C T  D E S C R I P T I O N                                -->
+  <!-- =================================================================== -->
+
   <parent>
-    <groupId>org.apache.jackrabbit</groupId>
-    <artifactId>oak-parent</artifactId>
+    <groupId>org.apache.jackrabbit.oak</groupId>
+    <artifactId>oak-perf-parent</artifactId>
     <version>0.3-SNAPSHOT</version>
-    <relativePath>../oak-parent/pom.xml</relativePath>
+    <relativePath>parent/pom.xml</relativePath>
   </parent>
 
-  <artifactId>oak-bench</artifactId>
-  <name>Oak Benchmark</name>
+  <artifactId>oak-perf</artifactId>
+  <name>Oak Performance Tests</name>
+  <packaging>pom</packaging>
 
-  <properties>
-    <skip.deployment>true</skip.deployment>
-  </properties>
+  <modules>
+    <module>parent</module>
+    <module>base</module>
+    <module>oak03</module>
+  </modules>
 
 </project>

Modified: jackrabbit/oak/trunk/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/pom.xml?rev=1350325&r1=1350324&r2=1350325&view=diff
==============================================================================
--- jackrabbit/oak/trunk/pom.xml (original)
+++ jackrabbit/oak/trunk/pom.xml Thu Jun 14 16:41:06 2012
@@ -44,7 +44,7 @@
     <module>oak-sling</module>
     <module>oak-run</module>
     <module>oak-it</module>
-    <module>oak-bench</module>
+    <!--<module>oak-bench</module>-->
   </modules>
 
   <scm>