Author: angela
Date: Fri Mar 11 09:49:03 2016
New Revision: 1734517
URL: http://svn.apache.org/viewvc?rev=1734517&view=rev
Log:
OAK-4118 : Benchmarks for Membership Operations (fixes, benchmarks for
removing members)
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMemberTest.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMembersTest.java
- copied, changed from r1734439,
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
Modified:
jackrabbit/oak/trunk/oak-run/run_concurrent_addmembers.sh
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
Modified: jackrabbit/oak/trunk/oak-run/run_concurrent_addmembers.sh
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/run_concurrent_addmembers.sh?rev=1734517&r1=1734516&r2=1734517&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/run_concurrent_addmembers.sh (original)
+++ jackrabbit/oak/trunk/oak-run/run_concurrent_addmembers.sh Fri Mar 11
09:49:03 2016
@@ -15,15 +15,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-TITLE=ManyGroupMembersTest
-BENCH="ManyGroupMembersTest"
-BATCH_SIZE="1"
-IMPORT_BEHAVIORS="besteffort ignore" #abort"
-MEMBERS_CNT="1 10 100 1000"
+TITLE=AddMembersTest_besteffort
+BENCH="AddMembersTest"
+BATCH_SIZE="10 50 100 500"
+IMPORT_BEHAVIOR="besteffort" # ignore abort"
+MEMBERS_CNT="1 10 100 500 1000 5000 10000"
RUNTIME=5
FIXS="Oak-Tar"
THREADS="1,10,20,50" #"1,2,4,8,10,15,20,50"
-PROFILE=false
+PROFILE=true
LOG=$TITLE"_$(date +'%Y%m%d_%H%M%S').csv"
echo "Benchmarks: $BENCH" > $LOG
@@ -33,21 +33,21 @@ echo "Concurrency: $THREADS" >> $LOG
echo "Profiling: $PROFILE" >> $LOG
echo "Batch Size: $BATCH_SIZE" >> $LOG
-echo "Import Behavior(s): $IMPORT_BEHAVIORS" >> $LOG
+echo "Import Behavior: $IMPORT_BEHAVIORS" >> $LOG
echo "Number of Members: $MEMBERS_CNT" >> $LOG
echo "--------------------------------------" >> $LOG
for bm in $BENCH
do
- for importBehavior in $IMPORT_BEHAVIORS
+ for batchsize in $BATCH_SIZE
do
for noMembers in $MEMBERS_CNT
do
- echo "Executing benchmarks with $noMembers members on
$importBehavior" | tee -a $LOG
+ echo "Executing benchmarks with $noMembers members with batchsize
$batchsize on $importBehavior" | tee -a $LOG
echo "-----------------------------------------------------------" |
tee -a $LOG
rm -rf target/Jackrabbit-* target/Oak-Tar-*
- cmd="java -Xmx2048m -Dprofile=$PROFILE -Druntime=$RUNTIME
-Dwarmup=1 -jar target/oak-run-*-SNAPSHOT.jar benchmark --batchSize $BATCH_SIZE
--importBehavior $importBehavior --numberOfUsers $noMembers --csvFile $LOG
--concurrency $THREADS --report false $bm $FIXS"
+ cmd="java -Xmx2048m -Dprofile=$PROFILE -Druntime=$RUNTIME
-Dwarmup=1 -jar target/oak-run-*-SNAPSHOT.jar benchmark --batchSize $batchsize
--importBehavior $IMPORT_BEHAVIOR --numberOfUsers $noMembers --csvFile $LOG
--concurrency $THREADS --report false $bm $FIXS"
echo $cmd
$cmd
done
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java?rev=1734517&r1=1734516&r2=1734517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
Fri Mar 11 09:49:03 2016
@@ -163,7 +163,6 @@ public class AddMembersTest extends Abst
Group g = (Group) userManager.getAuthorizableByPath(groupPath);
addMembers(userManager, g, s);
} catch (RepositoryException e) {
- System.out.println(e.getMessage());
if (s.hasPendingChanges()) {
s.refresh(false);
}
@@ -179,12 +178,12 @@ public class AddMembersTest extends Abst
if (batchSize <= DEFAULT_BATCH_SIZE) {
group.addMembers(USER + i);
} else {
- String[] ids = new String[batchSize];
+ List<String> ids = new ArrayList<String>(batchSize);
for (int j = 0; j < batchSize && i <= numberOfMembers; j++) {
- ids[j] = USER + i;
+ ids.add(USER + i);
i++;
}
- group.addMembers(ids);
+ group.addMembers(ids.toArray(new String[ids.size()]));
}
s.save();
}
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1734517&r1=1734516&r2=1734517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
Fri Mar 11 09:49:03 2016
@@ -329,6 +329,13 @@ public class BenchmarkRunner {
new AddMemberTest(
numberOfUsers.value(options)),
+ // benchmarks removing multiple or single members
+ new RemoveMembersTest(
+ numberOfUsers.value(options),
+ batchSize.value(options)),
+ new RemoveMemberTest(
+ numberOfUsers.value(options)),
+
// benchmark testing isMember/isDeclared member; each user only
being member of 1 group
new IsMemberTest(
numberOfUsers.value(options),
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMemberTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMemberTest.java?rev=1734517&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMemberTest.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMemberTest.java
Fri Mar 11 09:49:03 2016
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.benchmark;
+
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import javax.annotation.Nonnull;
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.security.auth.Subject;
+
+import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.UserManager;
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.fixture.JcrCreator;
+import org.apache.jackrabbit.oak.fixture.OakRepositoryFixture;
+import org.apache.jackrabbit.oak.fixture.RepositoryFixture;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
+import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
+import org.apache.jackrabbit.util.Text;
+
+/**
+ * Test the performance of removing members from groups. The
+ * following parameters can be used to run the benchmark:
+ *
+ * - numberOfMembers : numberOfMembers : the number of members that should be
+ * added in the test setup to each group and later on removed during the
test-run.
+ *
+ * Note the members to be removed are picked randomly and may or may not/no
longer
+ * be member of the target group.
+ */
+public class RemoveMemberTest extends AbstractTest {
+
+ static final String REL_TEST_PATH = "testPath";
+ static final String USER = "user";
+ static final String GROUP = "group";
+ static final int GROUP_CNT = 100;
+
+ final Random random = new Random();
+ final int numberOfMembers;
+
+ private final List<String> groupPaths = new ArrayList(GROUP_CNT);
+
+ public RemoveMemberTest(int numberOfMembers) {
+ this.numberOfMembers = numberOfMembers;
+ }
+
+ @Override
+ public void beforeSuite() throws Exception {
+ super.beforeSuite();
+
+ Session s = loginAdministrative();
+ try {
+ UserManager userManager = ((JackrabbitSession) s).getUserManager();
+ createUsers(userManager);
+
+ for (int i = 0; i <= GROUP_CNT; i++) {
+ Group g = userManager.createGroup(new PrincipalImpl(GROUP +
i), REL_TEST_PATH);
+ groupPaths.add(g.getPath());
+
+ List<String> ids = new ArrayList<String>();
+ for (int j = 0; j <= numberOfMembers; j++) {
+ ids.add(USER + j);
+ }
+ g.addMembers(ids.toArray(new String[ids.size()]));
+ s.save();
+ }
+ } finally {
+ s.logout();
+ }
+ System.out.println("setup done");
+ }
+
+
+ protected void createUsers(@Nonnull UserManager userManager) throws
Exception {
+
+ }
+
+ @Override
+ public void afterSuite() throws Exception {
+ Session s = loginAdministrative();
+ try {
+ Authorizable authorizable = ((JackrabbitSession)
s).getUserManager().getAuthorizable(GROUP + "0");
+ if (authorizable != null) {
+ Node n =
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+ n.remove();
+ }
+
+ // remove test-users if they have been created
+ authorizable = ((JackrabbitSession)
s).getUserManager().getAuthorizable(USER + "0");
+ if (authorizable != null) {
+ Node n =
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+ n.remove();
+ }
+
+ s.save();
+ } finally {
+ s.logout();
+ }
+ }
+
+ @Override
+ protected Repository[] createRepository(RepositoryFixture fixture) throws
Exception {
+ if (fixture instanceof OakRepositoryFixture) {
+ return ((OakRepositoryFixture) fixture).setUpCluster(1, new
JcrCreator() {
+ @Override
+ public Jcr customize(Oak oak) {
+ SecurityProvider sp = new
SecurityProviderImpl(ConfigurationParameters.of(UserConfiguration.NAME,
+
ConfigurationParameters.of(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR,
ImportBehavior.NAME_BESTEFFORT)));
+ return new Jcr(oak).with(sp);
+ }
+ });
+ } else {
+ return super.createRepository(fixture);
+ }
+ }
+
+ @Override
+ public void runTest() throws Exception {
+ Session s = null;
+ try {
+ // use system session login to avoid measuring the
login-performance here
+ s = Subject.doAsPrivileged(SystemSubject.INSTANCE, new
PrivilegedExceptionAction<Session>() {
+ @Override
+ public Session run() throws Exception {
+ return getRepository().login(null, null);
+ }
+ }, null);
+ UserManager userManager = ((JackrabbitSession) s).getUserManager();
+ String groupPath = groupPaths.get(random.nextInt(GROUP_CNT));
+ Group g = (Group) userManager.getAuthorizableByPath(groupPath);
+ removeMembers(userManager, g, s);
+ } catch (RepositoryException e) {
+ if (s.hasPendingChanges()) {
+ s.refresh(false);
+ }
+ } finally {
+ if (s != null) {
+ s.logout();
+ }
+ }
+ }
+
+ protected void removeMembers(@Nonnull UserManager userManger, @Nonnull
Group group, @Nonnull Session s) throws Exception {
+ for (int i = 0; i <= numberOfMembers; i++) {
+ Authorizable member = userManger.getAuthorizable(USER +
random.nextInt(numberOfMembers));
+ if (group.removeMember(member)) {
+ s.save();
+ }
+ }
+ }
+}
Copied:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMembersTest.java
(from r1734439,
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMembersTest.java?p2=jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMembersTest.java&p1=jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java&r1=1734439&r2=1734517&rev=1734517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/RemoveMembersTest.java
Fri Mar 11 09:49:03 2016
@@ -47,18 +47,17 @@ import org.apache.jackrabbit.oak.spi.xml
import org.apache.jackrabbit.util.Text;
/**
- * Test the performance of adding a configured number of members to groups. The
+ * Test the performance of removing members from groups. The
* following parameters can be used to run the benchmark:
*
- * - numberOfMembers : the number of members that should be added in the test
run
- * - batchSize : the size of the memberID-array to be passed to the addMembers
call
- * - importBehavior : the {@link
org.apache.jackrabbit.oak.spi.xml.ImportBehavior}; valid options are
"besteffort", "ignore" and "abort"
+ * - numberOfMembers : the number of members that should be added in the test
setup
+ * to each group (and removed during the test-run)
+ * - batchSize : the size of the memberID-array to be passed to the
removeMembers call
*
- * An importbehavior of "ignore" and "abort" will required the members to exist
- * and will resolve each ID to the corresponding authorizble first (different
test
- * setup). In case of "besteffort" the member is not resolved to an
authorizable.
+ * Note the members to be removed are picked randomly and may or may not/no
longer
+ * be member of the target group.
*/
-public class AddMembersTest extends AbstractTest {
+public class RemoveMembersTest extends AbstractTest {
static final String REL_TEST_PATH = "testPath";
static final String USER = "user";
@@ -69,14 +68,12 @@ public class AddMembersTest extends Abst
final Random random = new Random();
final int numberOfMembers;
private final int batchSize;
- private final String importBehavior;
private final List<String> groupPaths = new ArrayList(GROUP_CNT);
- public AddMembersTest(int numberOfMembers, int batchSize, @Nonnull String
importBehavior) {
+ public RemoveMembersTest(int numberOfMembers, int batchSize) {
this.numberOfMembers = numberOfMembers;
this.batchSize = batchSize;
- this.importBehavior = importBehavior;
}
@Override
@@ -86,27 +83,28 @@ public class AddMembersTest extends Abst
Session s = loginAdministrative();
try {
UserManager userManager = ((JackrabbitSession) s).getUserManager();
+ createUsers(userManager);
+
for (int i = 0; i <= GROUP_CNT; i++) {
Group g = userManager.createGroup(new PrincipalImpl(GROUP +
i), REL_TEST_PATH);
groupPaths.add(g.getPath());
- }
-
- createUsers(userManager);
+ List<String> ids = new ArrayList<String>();
+ for (int j = 0; j <= numberOfMembers; j++) {
+ ids.add(USER + j);
+ }
+ g.addMembers(ids.toArray(new String[ids.size()]));
+ s.save();
+ }
} finally {
- s.save();
s.logout();
}
System.out.println("setup done");
}
+
protected void createUsers(@Nonnull UserManager userManager) throws
Exception {
- if (!ImportBehavior.NAME_BESTEFFORT.equals(importBehavior)) {
- for (int i = 0; i <= numberOfMembers; i++) {
- String id = USER + i;
- userManager.createUser(id, null, new PrincipalImpl(id),
REL_TEST_PATH);
- }
- }
+ // nothing to do here as we add|remove members by ID in the setup and
the test
}
@Override
@@ -119,13 +117,13 @@ public class AddMembersTest extends Abst
n.remove();
}
- if (!ImportBehavior.NAME_BESTEFFORT.equals(importBehavior)) {
- authorizable = ((JackrabbitSession)
s).getUserManager().getAuthorizable(USER + "0");
- if (authorizable != null) {
- Node n =
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
- n.remove();
- }
+ // remove test-users if they have been created
+ authorizable = ((JackrabbitSession)
s).getUserManager().getAuthorizable(USER + "0");
+ if (authorizable != null) {
+ Node n =
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+ n.remove();
}
+
s.save();
} finally {
s.logout();
@@ -138,7 +136,8 @@ public class AddMembersTest extends Abst
return ((OakRepositoryFixture) fixture).setUpCluster(1, new
JcrCreator() {
@Override
public Jcr customize(Oak oak) {
- SecurityProvider sp = new
SecurityProviderImpl(ConfigurationParameters.of(UserConfiguration.NAME,
ConfigurationParameters.of(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR,
importBehavior)));
+ SecurityProvider sp = new
SecurityProviderImpl(ConfigurationParameters.of(UserConfiguration.NAME,
+
ConfigurationParameters.of(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR,
ImportBehavior.NAME_BESTEFFORT)));
return new Jcr(oak).with(sp);
}
});
@@ -161,9 +160,8 @@ public class AddMembersTest extends Abst
UserManager userManager = ((JackrabbitSession) s).getUserManager();
String groupPath = groupPaths.get(random.nextInt(GROUP_CNT));
Group g = (Group) userManager.getAuthorizableByPath(groupPath);
- addMembers(userManager, g, s);
+ removeMembers(userManager, g, s);
} catch (RepositoryException e) {
- System.out.println(e.getMessage());
if (s.hasPendingChanges()) {
s.refresh(false);
}
@@ -174,17 +172,17 @@ public class AddMembersTest extends Abst
}
}
- protected void addMembers(@Nonnull UserManager userManger, @Nonnull Group
group, @Nonnull Session s) throws Exception {
+ protected void removeMembers(@Nonnull UserManager userManger, @Nonnull
Group group, @Nonnull Session s) throws Exception {
for (int i = 0; i <= numberOfMembers; i++) {
if (batchSize <= DEFAULT_BATCH_SIZE) {
- group.addMembers(USER + i);
+ group.removeMembers(USER + random.nextInt(numberOfMembers));
} else {
- String[] ids = new String[batchSize];
- for (int j = 0; j < batchSize && i <= numberOfMembers; j++) {
- ids[j] = USER + i;
+ List<String> ids = new ArrayList<String>(batchSize);
+ for (int j = 0; j < batchSize; j++) {
+ ids.add(USER + random.nextInt(numberOfMembers));
i++;
}
- group.addMembers(ids);
+ group.removeMembers(ids.toArray(new String[ids.size()]));
}
s.save();
}