Index: ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/PrincipalNameResolutionTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/PrincipalNameResolutionTest.java (revision ) +++ ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/PrincipalNameResolutionTest.java (revision ) @@ -0,0 +1,54 @@ +/* + * 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.authentication.external; + +import javax.security.auth.login.Configuration; + +import com.google.common.collect.ImmutableList; +import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters; +import org.apache.jackrabbit.oak.spi.security.authentication.ConfigurationUtil; +import org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityRef; +import org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx.SyncMBeanImpl; +import org.apache.jackrabbit.oak.spi.security.authentication.external.impl.jmx.SynchronizationMBean; + +/** + * Benchmark for {@link SynchronizationMBean#syncExternalUsers(String[])} + */ +public class PrincipalNameResolutionTest extends AbstractExternalTest { + + private SynchronizationMBean bean; + + public PrincipalNameResolutionTest(int numberOfUsers, int membershipSize, long expTime, int roundtripDelay) { + super(numberOfUsers, membershipSize, expTime, true, ImmutableList.of(), roundtripDelay); + } + + @Override + protected Configuration createConfiguration() { + return ConfigurationUtil.getDefaultConfiguration(ConfigurationParameters.EMPTY); + } + + @Override + protected void beforeSuite() throws Exception { + super.beforeSuite(); + bean = new SyncMBeanImpl(getContentRepository(), getSecurityProvider(), syncManager, syncConfig.getName(), idpManager, idp.getName()); + } + + @Override + protected void runTest() throws Exception { + bean.syncExternalUsers(new String[]{new ExternalIdentityRef(getRandomUserId(), idp.getName()).getString()}); + } +} \ No newline at end of file Index: ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java (revision 1781098) +++ ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java (revision ) @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.concurrent.TimeUnit; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.jcr.Credentials; @@ -52,6 +53,7 @@ import org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProviderManager; import org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityRef; import org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalUser; +import org.apache.jackrabbit.oak.spi.security.authentication.external.PrincipalNameResolver; import org.apache.jackrabbit.oak.spi.security.authentication.external.SyncHandler; import org.apache.jackrabbit.oak.spi.security.authentication.external.SyncManager; import org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncConfig; @@ -101,6 +103,7 @@ final SyncHandler syncHandler = new DefaultSyncHandler(syncConfig); final ExternalIdentityProvider idp; + final long delay; SyncManagerImpl syncManager; ExternalIdentityProviderManager idpManager; @@ -108,7 +111,16 @@ protected AbstractExternalTest(int numberOfUsers, int numberOfGroups, long expTime, boolean dynamicMembership, @Nonnull List autoMembership) { - idp = new TestIdentityProvider(numberOfUsers, numberOfGroups); + this(numberOfUsers, numberOfGroups, expTime, dynamicMembership, autoMembership, 0); + } + + protected AbstractExternalTest(int numberOfUsers, int numberOfGroups, + long expTime, boolean dynamicMembership, + @Nonnull List autoMembership, + int roundtripDelay) { + + idp = (roundtripDelay < 0) ? new PrincipalResolvingProvider(numberOfUsers, numberOfGroups) : new TestIdentityProvider(numberOfUsers, numberOfGroups); + delay = roundtripDelay; syncConfig.user() .setMembershipNestingDepth(1) .setDynamicMembership(dynamicMembership) @@ -116,6 +128,7 @@ .setExpirationTime(expTime).setPathPrefix(PATH_PREFIX); syncConfig.group() .setExpirationTime(expTime).setPathPrefix(PATH_PREFIX); + } protected abstract Configuration createConfiguration(); @@ -237,7 +250,7 @@ } } - private final class TestIdentityProvider implements ExternalIdentityProvider { + class TestIdentityProvider implements ExternalIdentityProvider { private final int numberOfUsers; private final int membershipSize; @@ -261,6 +274,13 @@ if (id.charAt(0) == 'u') { return new TestUser(index); } else { + if (delay > 0) { + try { + TimeUnit.MILLISECONDS.sleep(delay); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } return new TestGroup(index); } } @@ -313,6 +333,19 @@ } else { return ImmutableSet.of(); } + } + } + + private class PrincipalResolvingProvider extends TestIdentityProvider implements PrincipalNameResolver { + + private PrincipalResolvingProvider(int numberOfUsers, int membershipSize) { + super(numberOfUsers, membershipSize); + } + + @Nonnull + @Override + public String fromExternalIdentityRef(@Nonnull ExternalIdentityRef externalIdentityRef) { + return "p_" + externalIdentityRef.getId(); } } \ No newline at end of file Index: ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java (revision 1781098) +++ ../oak/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java (revision ) @@ -40,6 +40,7 @@ import joptsimple.OptionSpec; import org.apache.commons.io.FileUtils; import org.apache.jackrabbit.oak.benchmark.authentication.external.ExternalLoginTest; +import org.apache.jackrabbit.oak.benchmark.authentication.external.PrincipalNameResolutionTest; import org.apache.jackrabbit.oak.benchmark.authentication.external.SyncAllExternalUsersTest; import org.apache.jackrabbit.oak.benchmark.authentication.external.SyncExternalUsersTest; import org.apache.jackrabbit.oak.benchmark.authorization.AceCreationTest; @@ -153,6 +154,8 @@ .withOptionalArg().ofType(Boolean.class).defaultsTo(Boolean.FALSE); OptionSpec autoMembership = parser.accepts("autoMembership", "Ids of those groups a given external identity automatically become member of.") .withOptionalArg().ofType(String.class).withValuesSeparatedBy(','); + OptionSpec roundtripDelay = parser.accepts("roundtripDelay", "Use simplified principal name lookup from ExtIdRef by specifying roundtrip delay of value < 0.") + .withOptionalArg().ofType(Integer.class).defaultsTo(0); OptionSpec transientWrites = parser.accepts("transient", "Do not save data.") .withOptionalArg().ofType(Boolean.class) .defaultsTo(Boolean.FALSE); @@ -431,6 +434,8 @@ new ExternalLoginTest(numberOfUsers.value(options), numberOfGroups.value(options), expiration.value(options), dynamicMembership.value(options), autoMembership.values(options)), new SyncAllExternalUsersTest(numberOfUsers.value(options), numberOfGroups.value(options), expiration.value(options), dynamicMembership.value(options), autoMembership.values(options)), new SyncExternalUsersTest(numberOfUsers.value(options), numberOfGroups.value(options), expiration.value(options), dynamicMembership.value(options), autoMembership.values(options), batchSize.value(options)), + new PrincipalNameResolutionTest(numberOfUsers.value(options), numberOfGroups.value(options), expiration.value(options), roundtripDelay.value(options)), + new HybridIndexTest(base.value(options), statsProvider), new BundlingNodeTest(), new PersistentCacheTest(statsProvider)