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();
         }


Reply via email to