You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2019/10/01 16:17:02 UTC

svn commit: r1867848 - in /jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark: ./ authorization/permission/ authorization/principalbased/

Author: angela
Date: Tue Oct  1 16:17:02 2019
New Revision: 1867848

URL: http://svn.apache.org/viewvc?rev=1867848&view=rev
Log:
OAK-8491 : Review default size of eagerCache parameter

Added:
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/permission/
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/permission/EagerCacheSizeTest.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentHasPermissionTest.java
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentReadRandomNodeAndItsPropertiesTest.java
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentTraversalTest.java
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java
    jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java

Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1867848&r1=1867847&r2=1867848&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java Tue Oct  1 16:17:02 2019
@@ -49,6 +49,7 @@ import org.apache.jackrabbit.oak.benchma
 import org.apache.jackrabbit.oak.benchmark.authentication.external.SyncExternalUsersTest;
 import org.apache.jackrabbit.oak.benchmark.authorization.AceCreationTest;
 import org.apache.jackrabbit.oak.benchmark.authorization.CanReadNonExisting;
+import org.apache.jackrabbit.oak.benchmark.authorization.permission.EagerCacheSizeTest;
 import org.apache.jackrabbit.oak.benchmark.authorization.principalbased.HasItemGetItemIsModifiedTest;
 import org.apache.jackrabbit.oak.benchmark.authorization.principalbased.PermissionEvaluationTest;
 import org.apache.jackrabbit.oak.benchmark.authorization.principalbased.PrinicipalBasedReadTest;
@@ -380,6 +381,11 @@ public class BenchmarkRunner {
                     compositionType.value(options),
                     useAggregationFilter.value(options),
                     report.value(options)),
+            new EagerCacheSizeTest(itemsToRead.value(options),
+                    numberOfInitialAce.value(options),
+                    numberOfUsers.value(options),
+                    cacheSize,
+                    report.value(options)),
             new ConcurrentReadDeepTreeTest(
                     runAsAdmin.value(options),
                     itemsToRead.value(options),

Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentHasPermissionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentHasPermissionTest.java?rev=1867848&r1=1867847&r2=1867848&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentHasPermissionTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentHasPermissionTest.java Tue Oct  1 16:17:02 2019
@@ -55,14 +55,11 @@ public class ConcurrentHasPermissionTest
         try {
             int allows = 0;
             int denies = 0;
-            int size = allPaths.size();
             long start = System.currentTimeMillis();
             for (int i = 0; i < cnt; i++) {
-                double rand = size * Math.random();
-                int index = (int) Math.floor(rand);
-                String path = allPaths.get(index);
+                String path = getRandom(allPaths);
 
-                String actions = getRandomActions();
+                String actions = getRandom(ACTIONS);
                 if (testSession.hasPermission(path, actions)) {
                     allows++;
                 } else {
@@ -79,9 +76,4 @@ public class ConcurrentHasPermissionTest
             }
         }
     }
-
-    private static String getRandomActions() {
-        int index = (int) Math.floor(10 * Math.random());
-        return ACTIONS.get(index);
-    }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentReadRandomNodeAndItsPropertiesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentReadRandomNodeAndItsPropertiesTest.java?rev=1867848&r1=1867847&r2=1867848&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentReadRandomNodeAndItsPropertiesTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentReadRandomNodeAndItsPropertiesTest.java Tue Oct  1 16:17:02 2019
@@ -47,12 +47,9 @@ public class ConcurrentReadRandomNodeAnd
             int nodeCnt = 0;
             int propertyCnt = 0;
             int noAccess = 0;
-            int size = allPaths.size();
             long start = System.currentTimeMillis();
             for (int i = 0; i < cnt; i++) {
-                double rand = size * Math.random();
-                int index = (int) Math.floor(rand);
-                String path = allPaths.get(index);
+                String path = getRandom(allPaths);
                 if (testSession.itemExists(path)) {
                     Item item = testSession.getItem(path);
                     if (item.isNode()) {

Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentTraversalTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentTraversalTest.java?rev=1867848&r1=1867847&r2=1867848&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentTraversalTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ConcurrentTraversalTest.java Tue Oct  1 16:17:02 2019
@@ -51,12 +51,9 @@ public class ConcurrentTraversalTest ext
             int nodeCnt = 0;
             int propertyCnt = 0;
             int noAccess = 0;
-            int size = allPaths.size();
             long start = System.currentTimeMillis();
             for (int i = 0; i < cnt; i++) {
-                double rand = size * Math.random();
-                int index = (int) Math.floor(rand);
-                String path = allPaths.get(index);
+                String path = getRandom(allPaths);
                 if (testSession.itemExists(path)) {
                     Item item = testSession.getItem(path);
                     Visitor visitor = new Visitor();

Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java?rev=1867848&r1=1867847&r2=1867848&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/CugOakTest.java Tue Oct  1 16:17:02 2019
@@ -106,12 +106,9 @@ public class CugOakTest extends CugTest
             int nodeCnt = 0;
             int propertyCnt = 0;
             int noAccess = 0;
-            int size = allPaths.size();
             long start = System.currentTimeMillis();
             for (int i = 0; i < itemsToRead; i++) {
-                double rand = size * Math.random();
-                int index = (int) Math.floor(rand);
-                String path = allPaths.get(index);
+                String path = getRandom(allPaths);
                 TreeLocation treeLocation = TreeLocation.create(root, path);
                 if (treeLocation.exists()) {
                     PropertyState ps = treeLocation.getProperty();

Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java?rev=1867848&r1=1867847&r2=1867848&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadDeepTreeTest.java Tue Oct  1 16:17:02 2019
@@ -36,6 +36,7 @@ import org.apache.jackrabbit.api.securit
 import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
 import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
 import org.apache.jackrabbit.util.Text;
+import org.jetbrains.annotations.NotNull;
 
 /**
  * Randomly read 1000 items from the deep tree.
@@ -142,12 +143,9 @@ public class ReadDeepTreeTest extends Ab
             int nodeCnt = 0;
             int propertyCnt = 0;
             int noAccess = 0;
-            int size = allPaths.size();
             long start = System.currentTimeMillis();
             for (int i = 0; i < cnt; i++) {
-                double rand = size * Math.random();
-                int index = (int) Math.floor(rand);
-                String path = allPaths.get(index);
+                String path = getRandom(allPaths);
                 if (testSession.itemExists(path)) {
                     Item item = testSession.getItem(path);
                     if (item.isNode()) {
@@ -210,4 +208,9 @@ public class ReadDeepTreeTest extends Ab
         return path;
     }
 
+    @NotNull
+    protected static String getRandom(@NotNull List<String> strings) {
+        int index = (int) Math.floor(strings.size() * Math.random());
+        return strings.get(index);
+    }
 }

Added: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/permission/EagerCacheSizeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/permission/EagerCacheSizeTest.java?rev=1867848&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/permission/EagerCacheSizeTest.java (added)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/permission/EagerCacheSizeTest.java Tue Oct  1 16:17:02 2019
@@ -0,0 +1,190 @@
+/*
+ * 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.authorization.permission;
+
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.User;
+import org.apache.jackrabbit.api.security.user.UserManager;
+import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.benchmark.ReadDeepTreeTest;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+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.internal.SecurityProviderBuilder;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.security.Privilege;
+import javax.security.auth.Subject;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import static javax.jcr.security.Privilege.JCR_ALL;
+
+public class EagerCacheSizeTest extends ReadDeepTreeTest {
+
+    private static final Logger log = LoggerFactory.getLogger(EagerCacheSizeTest.class);
+
+    private final int numberOfACEs;
+    private final int subjectSize;
+    private final long eagerCacheSize;
+
+    private final List<String> nodePaths = new ArrayList<>();
+    private Subject subject;
+
+    public EagerCacheSizeTest(int itemsToRead, int numberOfACEs, int subjectSize, long eagerCacheSize, boolean doReport) {
+        super(false, itemsToRead, doReport, false);
+        this.numberOfACEs = numberOfACEs;
+        this.subjectSize = subjectSize;
+        this.eagerCacheSize = eagerCacheSize;
+    }
+
+    @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) {
+                    ConfigurationParameters params = ConfigurationParameters.of("eagerCacheSize", eagerCacheSize);
+                    SecurityProvider securityProvider = SecurityProviderBuilder.newBuilder().with(ConfigurationParameters.of(AuthorizationConfiguration.NAME, params)).build();
+                    return new Jcr(oak).with(securityProvider);
+                }
+            });
+        } else {
+            throw new IllegalArgumentException("Fixture " + fixture + " not supported for this benchmark.");
+        }
+    }
+
+    @Override
+    protected void beforeSuite() throws Exception {
+        super.beforeSuite();
+
+        // populate subject
+        subject = new Subject();
+        UserManager userManager = ((JackrabbitSession) adminSession).getUserManager();
+        for (int i = 0; i < subjectSize; i++) {
+            User user = userManager.createSystemUser("system_" +i, null);
+            subject.getPrincipals().add(user.getPrincipal());
+        }
+        adminSession.save();
+
+        JackrabbitAccessControlManager acMgr = (JackrabbitAccessControlManager) adminSession.getAccessControlManager();
+
+        // grant read at the root
+        Principal principal = subject.getPrincipals().iterator().next();
+        Privilege[] readPrivs = AccessControlUtils.privilegesFromNames(acMgr, Privilege.JCR_READ);
+        addEntry(acMgr, principal, PathUtils.ROOT_PATH, readPrivs);
+
+        // create additional ACEs for each principal in the subject
+        List<Privilege> allPrivileges = Lists.newArrayList(acMgr.privilegeFromName(JCR_ALL).getAggregatePrivileges());
+        Iterator<Principal> principalIterator = Iterators.cycle(subject.getPrincipals());
+        int cnt = 0;
+        while (cnt < numberOfACEs) {
+            if (!principalIterator.hasNext()) {
+                throw new IllegalStateException("Cannot setup ACE. no principals available.");
+            }
+            if (addEntry(acMgr, principalIterator.next(), getRandom(nodePaths), getRandomPrivileges(allPrivileges))) {
+                cnt++;
+            }
+        }
+        adminSession.save();
+
+        System.out.println("BEFORE DONE");
+    }
+
+    @Override
+    protected void visitingNode(Node node, int i) throws RepositoryException {
+        super.visitingNode(node, i);
+        String path = node.getPath();
+        if (!path.contains(AccessControlConstants.REP_POLICY)) {
+            nodePaths.add(path);
+        }
+    }
+
+    @NotNull
+    private static Privilege[] getRandomPrivileges(@NotNull List<Privilege> allPrivileges) {
+        Collections.shuffle(allPrivileges);
+        return allPrivileges.subList(0, 3).toArray(new Privilege[0]);
+    }
+
+    private static boolean addEntry(@NotNull JackrabbitAccessControlManager acMgr, @NotNull Principal principal, @NotNull String path, @NotNull Privilege[] privileges) throws RepositoryException {
+        JackrabbitAccessControlList acl = AccessControlUtils.getAccessControlList(acMgr, path);
+        if (acl == null) {
+            throw new IllegalStateException("No policy to setup ACE.");
+        }
+        boolean added = acl.addAccessControlEntry(principal, privileges);
+        if (added) {
+            acMgr.setPolicy(acl.getPath(), acl);
+        }
+        return added;
+    }
+
+    @Override
+    protected void afterSuite() throws Exception {
+        try {
+            UserManager userManager = ((JackrabbitSession) adminSession).getUserManager();
+            for (Principal p : subject.getPrincipals()) {
+                Authorizable a = userManager.getAuthorizable(p);
+                if (a != null) {
+                    a.remove();
+                }
+            }
+            adminSession.save();
+        }  finally  {
+            super.afterSuite();
+        }
+    }
+
+    @NotNull
+    @Override
+    protected Session getTestSession() {
+        return loginSubject(subject);
+    }
+
+    @NotNull
+    @Override
+    protected String getImportFileName() {
+        return "deepTree.xml";
+    }
+
+    @NotNull
+    @Override
+    protected String getTestNodeName() {
+        return "EagerCacheSizeTest";
+    }
+
+}
\ No newline at end of file

Propchange: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/permission/EagerCacheSizeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java?rev=1867848&r1=1867847&r2=1867848&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java Tue Oct  1 16:17:02 2019
@@ -160,12 +160,6 @@ public class PrinicipalBasedReadTest ext
     }
 
     @NotNull
-    static String getRandom(@NotNull List<String> paths) {
-        int index = (int) Math.floor(paths.size() * Math.random());
-        return paths.get(index);
-    }
-
-    @NotNull
     private static Privilege[] getRandomPrivileges(@NotNull List<Privilege> allPrivileges) {
         Collections.shuffle(allPrivileges);
         return allPrivileges.subList(0, 3).toArray(new Privilege[0]);