Author: angela
Date: Thu Mar 10 18:08:59 2016
New Revision: 1734439
URL: http://svn.apache.org/viewvc?rev=1734439&view=rev
Log:
OAK-4118 : Benchmarks for Membership Operations (wip)
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java
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/IsDeclaredMemberTest.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java
- copied, changed from r1734426,
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java
Removed:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java
Modified:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java?rev=1734439&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java
Thu Mar 10 18:08:59 2016
@@ -0,0 +1,97 @@
+/*
+ * 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 javax.annotation.Nonnull;
+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.User;
+import org.apache.jackrabbit.api.security.user.UserManager;
+import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+
+/**
+ * Test the performance of adding a configured number of members to groups. The
+ * following parameters can be used to run the benchmark:
+ *
+ * - numberOfMembers : the number of members that should be added in the test
run
+ *
+ * In contrast to {@link AddMembersTest}, this benchmark will always call
+ * {@link Group#addMember(Authorizable)}.
+ */
+public class AddMemberTest extends AddMembersTest {
+
+ private final List<String> userPaths;
+
+ public AddMemberTest(int numberOfMembers) {
+ super(numberOfMembers, 1, ImportBehavior.NAME_ABORT);
+ userPaths = new ArrayList<String>(numberOfMembers);
+ }
+
+ protected void createUsers(@Nonnull UserManager userManager) throws
Exception {
+ for (int i = 0; i <= numberOfMembers; i++) {
+ String id = USER + i;
+ User u = userManager.createUser(id, null, new PrincipalImpl(id),
REL_TEST_PATH);
+ userPaths.add(u.getPath());
+ }
+ }
+
+ @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 groupId = GROUP + random.nextInt(GROUP_CNT);
+ Group g = userManager.getAuthorizable(groupId, Group.class);
+
+ } catch (RepositoryException e) {
+ System.out.println(e.getMessage());
+ if (s.hasPendingChanges()) {
+ s.refresh(false);
+ }
+ } finally {
+ if (s != null) {
+ s.logout();
+ }
+ }
+ }
+
+ @Override
+ protected void addMembers(@Nonnull UserManager userManager, @Nonnull Group
group, @Nonnull Session s) throws Exception {
+ for (int i = 0; i <= numberOfMembers; i++) {
+ String userPath = userPaths.get(random.nextInt(numberOfMembers));
+ group.addMember(userManager.getAuthorizableByPath(userPath));
+ s.save();
+ }
+ }
+}
Added:
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=1734439&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
Thu Mar 10 18:08:59 2016
@@ -0,0 +1,192 @@
+/*
+ * 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 adding a configured number of members to 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"
+ *
+ * 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.
+ */
+public class AddMembersTest 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;
+ static final int DEFAULT_BATCH_SIZE = 1;
+
+ 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) {
+ this.numberOfMembers = numberOfMembers;
+ this.batchSize = batchSize;
+ this.importBehavior = importBehavior;
+ }
+
+ @Override
+ public void beforeSuite() throws Exception {
+ super.beforeSuite();
+
+ Session s = loginAdministrative();
+ try {
+ UserManager userManager = ((JackrabbitSession) s).getUserManager();
+ 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);
+
+ } 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);
+ }
+ }
+ }
+
+ @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();
+ }
+
+ 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();
+ }
+ }
+ 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)));
+ 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);
+ addMembers(userManager, g, s);
+ } catch (RepositoryException e) {
+ System.out.println(e.getMessage());
+ if (s.hasPendingChanges()) {
+ s.refresh(false);
+ }
+ } finally {
+ if (s != null) {
+ s.logout();
+ }
+ }
+ }
+
+ protected void addMembers(@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);
+ } else {
+ String[] ids = new String[batchSize];
+ for (int j = 0; j < batchSize && i <= numberOfMembers; j++) {
+ ids[j] = USER + i;
+ i++;
+ }
+ group.addMembers(ids);
+ }
+ 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=1734439&r1=1734438&r2=1734439&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
Thu Mar 10 18:08:59 2016
@@ -101,7 +101,7 @@ public class BenchmarkRunner {
OptionSpec<Boolean> nestedGroups = parser.accepts("nestedGroups", "Use
nested groups.")
.withOptionalArg().ofType(Boolean.class).defaultsTo(false);
OptionSpec<Integer> batchSize = parser.accepts("batchSize", "Batch
size before persisting operations.")
-
.withOptionalArg().ofType(Integer.class).defaultsTo(ManyGroupMembersTest.DEFAULT_BATCH_SIZE);
+
.withOptionalArg().ofType(Integer.class).defaultsTo(AddMembersTest.DEFAULT_BATCH_SIZE);
OptionSpec<String> importBehavior = parser.accepts("importBehavior",
"Protected Item Import Behavior")
.withOptionalArg().ofType(String.class).defaultsTo(ImportBehavior.NAME_BESTEFFORT);
OptionSpec<Integer> itemsToRead = parser.accepts("itemsToRead",
"Number of items to read")
@@ -320,10 +320,41 @@ public class BenchmarkRunner {
new GetGroupPrincipalsTest(
numberOfGroups.value(options),
nestedGroups.value(options)),
- new ManyGroupMembersTest(
+
+ // benchmarks adding multiple or single members
+ new AddMembersTest(
numberOfUsers.value(options),
batchSize.value(options),
importBehavior.value(options)),
+ new AddMemberTest(
+ numberOfUsers.value(options)),
+
+ // benchmark testing isMember/isDeclared member; each user only
being member of 1 group
+ new IsMemberTest(
+ numberOfUsers.value(options),
+ nestedGroups.value(options)),
+ new IsDeclaredMemberTest(
+ numberOfUsers.value(options),
+ nestedGroups.value(options)),
+
+ // 4 benchmarks with the same setup test various membership
operations.
+ new MemberDeclaredMemberOf(
+ numberOfGroups.value(options),
+ nestedGroups.value(options),
+ numberOfUsers.value(options)),
+ new MemberMemberOf(
+ numberOfGroups.value(options),
+ nestedGroups.value(options),
+ numberOfUsers.value(options)),
+ new MemberIsDeclaredMember(
+ numberOfGroups.value(options),
+ nestedGroups.value(options),
+ numberOfUsers.value(options)),
+ new MemberIsMember(
+ numberOfGroups.value(options),
+ nestedGroups.value(options),
+ numberOfUsers.value(options)),
+
new FullTextSearchTest(
wikipedia.value(options),
flatStructure.value(options),
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java?rev=1734439&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java
Thu Mar 10 18:08:59 2016
@@ -0,0 +1,37 @@
+/*
+ * 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 javax.jcr.RepositoryException;
+
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+
+/**
+ * Same as {@link IsMemberTest} but the test run will check for the randomly
selected
+ * user to be a declared member of the target group.
+ */
+public class IsDeclaredMemberTest extends IsMemberTest {
+
+ public IsDeclaredMemberTest(int numberOfUsers, boolean nestedGroups) {
+ super(numberOfUsers, nestedGroups);
+ }
+
+ protected boolean isMember(Group g, Authorizable member) throws
RepositoryException {
+ return g.isDeclaredMember(member);
+ }
+}
Copied:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java
(from r1734426,
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java?p2=jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java&p1=jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java&r1=1734426&r2=1734439&rev=1734439&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java
(original)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java
Thu Mar 10 18:08:59 2016
@@ -20,8 +20,6 @@ import java.security.PrivilegedException
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
-import javax.annotation.Nonnull;
-import javax.jcr.Credentials;
import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
@@ -31,6 +29,7 @@ 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.User;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.fixture.JcrCreator;
@@ -48,58 +47,68 @@ 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
- * following parameters can be used to run the benchmark:
+ * Benchmark for {@link Group#isMember(Authorizable)} with the following setup:
+ * - 10 groups
+ * - boolean flag defining if the 10 groups will be nested or not.
+ * - configurable number of users that will be added as members.
*
- * - numberOfMembers : the number of members that should be added in the test
run
- * - batchSize : the number of members that should be added before calling
Session.save
- * - importBehavior : the {@link
org.apache.jackrabbit.oak.spi.xml.ImportBehavior}; valid options are
"besteffort", "ignore" and "abort"
+ * The test setup adds the configured number of users as members to the 10
groups,
+ * where the target group is picked randomly. But note that each user is only
+ * member of one single group!
*
- * For simplicity this benchmark makes use of {@link
Group#addMembers(String...)}.
- * An importbehavior of "ignore" and "abort" will required the members to exist
- * and will resolve each ID to the corresponding authorizble first. Those are
- * consequently almost equivalent to calling {@link
Group#addMember(org.apache.jackrabbit.api.security.user.Authorizable)}.
- * In case of "besteffort" the member is not resolved to an authorizable.
+ * The test run picks random users and tests for being member of a randomly
+ * selected group.
*/
-public class ManyGroupMembersTest extends AbstractTest {
+public class IsMemberTest extends AbstractTest {
private final Random random = new Random();
private static final String REL_TEST_PATH = "testPath";
+
private static final String USER = "user";
private static final String GROUP = "group";
- private static final int GROUP_CNT = 100;
+ private static final int GROUP_CNT = 10;
+
+ private final int numberOfUsers;
+ private final boolean nestedGroups;
- static final int DEFAULT_BATCH_SIZE = 1;
+ private List<String> gPaths = new ArrayList<String>();
+ private List<String> uPaths = new ArrayList<String>();
- private final int numberOfMembers;
- private final int batchSize;
- private final String importBehavior;
-
- public ManyGroupMembersTest(int numberOfMembers, int batchSize, @Nonnull
String importBehavior) {
- this.numberOfMembers = numberOfMembers;
- this.batchSize = batchSize;
- this.importBehavior = importBehavior;
+ public IsMemberTest(int numberOfUsers, boolean nestedGroups) {
+ this.numberOfUsers = numberOfUsers;
+ this.nestedGroups = nestedGroups;
}
@Override
- public void setUp(Repository repository, Credentials credentials) throws
Exception {
- super.setUp(repository, credentials);
+ protected void beforeSuite() throws Exception {
+ super.beforeSuite();
Session s = loginAdministrative();
try {
UserManager userManager = ((JackrabbitSession) s).getUserManager();
- for (int i = 0; i <= GROUP_CNT; i++) {
- userManager.createGroup(new PrincipalImpl(GROUP + i),
REL_TEST_PATH);
+ Group gr = userManager.createGroup(new PrincipalImpl(GROUP + 0),
REL_TEST_PATH);
+ gPaths.add(gr.getPath());
+ for (int i = 1; i < GROUP_CNT; i++) {
+ Group g = userManager.createGroup(new PrincipalImpl(GROUP +
i), REL_TEST_PATH);
+ if (nestedGroups) {
+ g.addMember(gr);
+ }
+ gr = g;
+ gPaths.add(gr.getPath());
}
- 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);
+ int cnt = 0;
+ for (int i = 0; i <= numberOfUsers; i++) {
+ User u = userManager.createUser(USER + i, null, new
PrincipalImpl(USER + i), REL_TEST_PATH);
+ uPaths.add(u.getPath());
+
+ getRandomGroup(userManager).addMember(u);
+
+ if (++cnt == 20000) {
+ s.save();
}
}
-
} finally {
s.save();
s.logout();
@@ -108,28 +117,22 @@ public class ManyGroupMembersTest extend
}
@Override
- public void tearDown() throws Exception {
+ public void afterSuite() throws Exception {
+ Session s = loginAdministrative();
try {
- Session s = loginAdministrative();
-
Authorizable authorizable = ((JackrabbitSession)
s).getUserManager().getAuthorizable(GROUP + "0");
if (authorizable != null) {
Node n =
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
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();
- }
+ authorizable = ((JackrabbitSession)
s).getUserManager().getAuthorizable(USER + "0");
+ if (authorizable != null) {
+ Node n =
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+ n.remove();
}
s.save();
- s.logout();
-
} finally {
- super.tearDown();
+ s.logout();
}
}
@@ -139,7 +142,7 @@ public class ManyGroupMembersTest extend
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);
}
});
@@ -160,30 +163,30 @@ public class ManyGroupMembersTest extend
}
}, null);
UserManager userManager = ((JackrabbitSession) s).getUserManager();
- String groupId = GROUP + random.nextInt(GROUP_CNT);
- Group g = userManager.getAuthorizable(groupId, Group.class);
- for (int i = 0; i <= numberOfMembers; i++) {
- if (batchSize <= DEFAULT_BATCH_SIZE) {
- g.addMembers(USER + i);
- } else {
- List<String> ids = new ArrayList<String>(batchSize);
- for (int j = 0; j < batchSize && i <= numberOfMembers;
j++) {
- ids.add(USER + i);
- i++;
- }
- g.addMembers(ids.toArray(new String[ids.size()]));
- }
- s.save();
+
+ for (int i = 0; i <= 1000; i++) {
+ Group g = getRandomGroup(userManager);
+ boolean isMember = isMember(g, getRandomUser(userManager));
+ //System.out.println(USER + i + " is " + (isMember? "" : "not
")+ "member of " +groupId);
}
} catch (RepositoryException e) {
System.out.println(e.getMessage());
- if (s.hasPendingChanges()) {
- s.refresh(false);
- }
} finally {
if (s != null) {
s.logout();
}
}
}
+
+ protected boolean isMember(Group g, Authorizable member) throws
RepositoryException {
+ return g.isMember(member);
+ }
+
+ private Group getRandomGroup(UserManager uMgr) throws RepositoryException {
+ return (Group)
uMgr.getAuthorizableByPath(gPaths.get(random.nextInt(GROUP_CNT)));
+ }
+
+ private User getRandomUser(UserManager uMgr) throws RepositoryException {
+ return (User)
uMgr.getAuthorizableByPath(uPaths.get(random.nextInt(numberOfUsers)));
+ }
}
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java?rev=1734439&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java
Thu Mar 10 18:08:59 2016
@@ -0,0 +1,184 @@
+/*
+ * 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 com.google.common.collect.ObjectArrays;
+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.User;
+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;
+
+/**
+ * Abstract test-base for the various membership related operations (isMember,
isDeclaredMember, memberOf, declaredMemberOf)
+ * with the following characteristics an config options:
+ *
+ * - 'numberOfGroups' : number of groups, which each member will become member
of
+ * - 'nested' : flag to enforce nesting of groups; in effect each group will
then become member of the previous group
+ * - 'numberOfMembers' : number of users to be created and which will become
member of all groups
+ *
+ * The test run randomly picks one group and one user and performs the
+ * member-operation as defined by the subclasses (see 'testMembership')
+ */
+abstract class MemberBaseTest extends AbstractTest {
+
+ private static final int BATCH_SIZE = 100;
+ private static final String REL_TEST_PATH = "testPath";
+ private static final String USER = "user";
+ private static final String GROUP = "group";
+
+ private final Random random = new Random();
+
+ private final int numberOfGroups;
+ private final int numberOfMembers;
+ private final boolean nested;
+
+ private final List<String> groupPaths;
+ private final List<String> memberPaths;
+
+ public MemberBaseTest(int numberOfGroups, boolean nested, int
numberOfMembers) {
+ this.numberOfGroups = numberOfGroups;
+ this.numberOfMembers = numberOfMembers;
+ this.nested = nested;
+
+ groupPaths = new ArrayList<String>(numberOfGroups);
+ memberPaths = new ArrayList<String>(numberOfMembers);
+ }
+
+ @Override
+ public void beforeSuite() throws Exception {
+ super.beforeSuite();
+
+ Session s = loginAdministrative();
+ try {
+ List<String> memberIds = new ArrayList<String>(numberOfMembers);
+ UserManager userManager = ((JackrabbitSession) s).getUserManager();
+ for (int i = 0; i <= numberOfMembers; i++) {
+ User u = userManager.createUser(USER + i, null, new
PrincipalImpl(USER + i), REL_TEST_PATH);
+ memberPaths.add(u.getPath());
+ memberIds.add(USER + i);
+ }
+
+ String[] idArray = memberIds.toArray(new String[memberIds.size()]);
+ for (int i = 0, j = 1; i <= numberOfGroups; i++, j++) {
+ Group g = userManager.createGroup(new PrincipalImpl(GROUP +
i), REL_TEST_PATH);
+ groupPaths.add(g.getPath());
+
+ if (nested) {
+ g.addMembers(ObjectArrays.concat(idArray, GROUP + j));
+ } else {
+ g.addMembers(idArray);
+ }
+ }
+ } finally {
+ s.save();
+ s.logout();
+ }
+ System.out.println("setup done");
+ }
+
+ @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();
+ }
+
+ 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
+ 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 uMgr = ((JackrabbitSession) s).getUserManager();
+ for (int i = 0; i <= 1000; i++) {
+ testMembership(
+ (Group)
uMgr.getAuthorizableByPath(groupPaths.get(random.nextInt(numberOfGroups))),
+ (User)
uMgr.getAuthorizableByPath(memberPaths.get(random.nextInt(numberOfMembers))));
+ }
+ } catch (RepositoryException e) {
+ System.out.println(e.getMessage());
+ } finally {
+ if (s != null) {
+ 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);
+ }
+ }
+
+ protected abstract void testMembership(@Nonnull Group g, @Nonnull User
member) throws Exception;
+}
\ No newline at end of file
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java?rev=1734439&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java
Thu Mar 10 18:08:59 2016
@@ -0,0 +1,37 @@
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Same as {@link MemberBaseTest} but only reading the declared membership.
+ */
+public class MemberDeclaredMemberOf extends MemberBaseTest {
+
+ public MemberDeclaredMemberOf(int numberOfGroups, boolean nested, int
numberOfMembers) {
+ super(numberOfGroups, nested, numberOfMembers);
+ }
+
+ @Override
+ protected void testMembership(@Nonnull Group g, @Nonnull User member)
throws Exception {
+ member.declaredMemberOf();
+ }
+}
\ No newline at end of file
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java?rev=1734439&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java
Thu Mar 10 18:08:59 2016
@@ -0,0 +1,38 @@
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Same as {@link MemberBaseTest} but testing {@link
Group#isDeclaredMember(Authorizable)}.
+ */
+public class MemberIsDeclaredMember extends MemberBaseTest {
+
+ public MemberIsDeclaredMember(int numberOfGroups, boolean nested, int
numberOfMembers) {
+ super(numberOfGroups, nested, numberOfMembers);
+ }
+
+ @Override
+ protected void testMembership(@Nonnull Group g, @Nonnull User member)
throws Exception {
+ g.isDeclaredMember(member);
+ }
+}
\ No newline at end of file
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java?rev=1734439&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java
Thu Mar 10 18:08:59 2016
@@ -0,0 +1,38 @@
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Same as {@link MemberBaseTest} but testing {@link
Group#isMember(Authorizable)}.
+ */
+public class MemberIsMember extends MemberBaseTest {
+
+ public MemberIsMember(int numberOfGroups, boolean nested, int
numberOfMembers) {
+ super(numberOfGroups, nested, numberOfMembers);
+ }
+
+ @Override
+ protected void testMembership(@Nonnull Group g, @Nonnull User member)
throws Exception {
+ g.isMember(member);
+ }
+}
\ No newline at end of file
Added:
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java?rev=1734439&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java
(added)
+++
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java
Thu Mar 10 18:08:59 2016
@@ -0,0 +1,37 @@
+/*
+ * 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 javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Same as {@link MemberBaseTest} but only reading the declared membership.
+ */
+public class MemberMemberOf extends MemberBaseTest {
+
+ public MemberMemberOf(int numberOfGroups, boolean nested, int
numberOfMembers) {
+ super(numberOfGroups, nested, numberOfMembers);
+ }
+
+ @Override
+ protected void testMembership(@Nonnull Group g, @Nonnull User member)
throws Exception {
+ member.memberOf();
+ }
+}
\ No newline at end of file