Author: angela Date: Fri Jun 22 14:39:13 2012 New Revision: 1352905 URL: http://svn.apache.org/viewvc?rev=1352905&view=rev Log: JCR-3356 : performance tests Added: jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractDeepTreeTest.java jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadAccessControlledTreeTest.java jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadDeepTreeTest.java jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ReadDeepTreeTest.java jackrabbit/trunk/test/performance/base/src/main/resources/deepTree.xml Added: jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractDeepTreeTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractDeepTreeTest.java?rev=1352905&view=auto ============================================================================== --- jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractDeepTreeTest.java (added) +++ jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/AbstractDeepTreeTest.java Fri Jun 22 14:39:13 2012 @@ -0,0 +1,103 @@ +/* + * 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.performance; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import javax.jcr.ImportUUIDBehavior; +import javax.jcr.Item; +import javax.jcr.ItemVisitor; +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.util.TraversingItemVisitor; + +public abstract class AbstractDeepTreeTest extends AbstractTest { + + protected Session adminSession; + protected Node testRoot; + + protected List allPaths; + + @Override + protected void beforeSuite() throws Exception { + adminSession = getRepository().login(getCredentials()); + String name = getClass().getSimpleName(); + Node rn = adminSession.getRootNode(); + + if (!rn.hasNode(name)) { + testRoot = adminSession.getRootNode().addNode(name, "nt:unstructured"); + InputStream in = getClass().getClassLoader().getResourceAsStream("deepTree.xml"); + adminSession.importXML(testRoot.getPath(), in, ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW); + adminSession.save(); + } else { + testRoot = rn.getNode(name); + } + + final List paths = new ArrayList(); + ItemVisitor v = new TraversingItemVisitor.Default() { + @Override + protected void entering(Node node, int i) throws RepositoryException { + paths.add(node.getPath()); + super.entering(node, i); + } + @Override + protected void entering(Property prop, int i) throws RepositoryException { + paths.add(prop.getPath()); + super.entering(prop, i); + } + }; + v.visit(testRoot); + allPaths = paths; + + System.out.println("All paths: " + allPaths.size()); + } + + @Override + protected void afterSuite() throws Exception { + testRoot.remove(); + adminSession.save(); + adminSession.logout(); + } + + protected static void randomRead(Session testSession, List allPaths, int cnt) throws RepositoryException { + int nodeCnt = 0; + int propertyCnt = 0; + int noAccess = 0; + int size = allPaths.size(); + long start = System.currentTimeMillis(); + for (int i = 0; i < cnt; i++) { + double rand = size * Math.random(); + int index = (int) Math.floor(rand); + String path = allPaths.get(index); + if (testSession.itemExists(path)) { + Item item = testSession.getItem(path); + if (item.isNode()) { + nodeCnt++; + } else { + propertyCnt++; + } + } else { + noAccess++; + } + } + long end = System.currentTimeMillis(); + System.out.println("Reading " + (cnt-noAccess) + " (Nodes: "+ nodeCnt +"; Properties: "+propertyCnt+") completed in " + (end - start)); + } +} Added: jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadAccessControlledTreeTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadAccessControlledTreeTest.java?rev=1352905&view=auto ============================================================================== --- jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadAccessControlledTreeTest.java (added) +++ jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadAccessControlledTreeTest.java Fri Jun 22 14:39:13 2012 @@ -0,0 +1,102 @@ +/* + * 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.performance; + +import javax.jcr.ItemVisitor; +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.security.AccessControlList; +import javax.jcr.security.AccessControlManager; +import javax.jcr.security.AccessControlPolicy; +import javax.jcr.security.AccessControlPolicyIterator; +import javax.jcr.security.Privilege; +import javax.jcr.util.TraversingItemVisitor; + +import org.apache.jackrabbit.core.security.principal.EveryonePrincipal; + +/** + * Concurrently reads random items from the deep tree where every 10th node is + * access controlled. + */ +public class ConcurrentReadAccessControlledTreeTest extends AbstractDeepTreeTest { + + private int bgReaders = 50; + private int cnt = 10000; + + @Override + protected void beforeSuite() throws Exception { + super.beforeSuite(); + + ItemVisitor visitor = new TraversingItemVisitor.Default() { + int counter = 0; + @Override + protected void entering(Node node, int level) throws RepositoryException { + if (++counter == 10) { + addPolicy(node); + counter = 0; + } + super.entering(node, level); + } + + private void addPolicy(Node node) throws RepositoryException { + AccessControlManager acMgr = node.getSession().getAccessControlManager(); + String path = node.getPath(); + AccessControlPolicyIterator acIterator = acMgr.getApplicablePolicies(path); + if (acIterator.hasNext()) { + AccessControlPolicy policy = acIterator.nextAccessControlPolicy(); + if (policy instanceof AccessControlList) { + AccessControlList acl = (AccessControlList) policy; + Privilege[] privileges = new Privilege[] { + acMgr.privilegeFromName(Privilege.JCR_READ), + acMgr.privilegeFromName(Privilege.JCR_READ_ACCESS_CONTROL) + }; + if (acl.addAccessControlEntry(EveryonePrincipal.getInstance(), privileges)) { + acMgr.setPolicy(path, acl); + node.getSession().save(); + } + } + } + } + }; + + visitor.visit(testRoot); + + for (int i = 0; i < bgReaders; i++) { + addBackgroundJob(new RandomRead()); + } + } + + @Override + protected void runTest() throws Exception { + RandomRead randomRead = new RandomRead(); + randomRead.run(); + } + + private class RandomRead implements Runnable { + + private final Session testSession = loginReader(); + + public void run() { + try { + randomRead(testSession, allPaths, cnt); + } catch (RepositoryException e) { + throw new RuntimeException(e); + } + } + } +} \ No newline at end of file Added: jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadDeepTreeTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadDeepTreeTest.java?rev=1352905&view=auto ============================================================================== --- jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadDeepTreeTest.java (added) +++ jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ConcurrentReadDeepTreeTest.java Fri Jun 22 14:39:13 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.performance; + +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +/** + * Concurrently reads random items from the deep tree. + */ +public class ConcurrentReadDeepTreeTest extends AbstractDeepTreeTest { + + private int bgReaders = 50; + private int cnt = 10000; + + @Override + protected void beforeSuite() throws Exception { + super.beforeSuite(); + + for (int i = 0; i < bgReaders; i++) { + addBackgroundJob(new RandomRead()); + } + } + + @Override + protected void runTest() throws Exception { + RandomRead randomRead = new RandomRead(); + randomRead.run(); + } + + private class RandomRead implements Runnable { + + private final Session testSession = loginReader(); + + public void run() { + try { + randomRead(testSession, allPaths, cnt); + } catch (RepositoryException e) { + throw new RuntimeException(e); + } + } + } +} \ No newline at end of file Added: jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ReadDeepTreeTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ReadDeepTreeTest.java?rev=1352905&view=auto ============================================================================== --- jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ReadDeepTreeTest.java (added) +++ jackrabbit/trunk/test/performance/base/src/main/java/org/apache/jackrabbit/performance/ReadDeepTreeTest.java Fri Jun 22 14:39:13 2012 @@ -0,0 +1,45 @@ +/* + * 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.performance; + +import javax.jcr.Session; + +/** + * Randomly read 100000 items from the deep tree. + */ +public class ReadDeepTreeTest extends AbstractDeepTreeTest { + + private Session testSession; + private int cnt = 100000; + + @Override + protected void beforeSuite() throws Exception { + super.beforeSuite(); + + testSession = getRepository().login(); + } + + @Override + protected void runTest() throws Exception { + randomRead(testSession, allPaths, cnt); + } + + @Override + protected void afterSuite() throws Exception { + testSession.logout(); + } +} \ No newline at end of file Added: jackrabbit/trunk/test/performance/base/src/main/resources/deepTree.xml URL: http://svn.apache.org/viewvc/jackrabbit/trunk/test/performance/base/src/main/resources/deepTree.xml?rev=1352905&view=auto ============================================================================== --- jackrabbit/trunk/test/performance/base/src/main/resources/deepTree.xml (added) +++ jackrabbit/trunk/test/performance/base/src/main/resources/deepTree.xml Fri Jun 22 14:39:13 2012 @@ -0,0 +1 @@ [... 3 lines stripped ...]