You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2013/08/27 00:05:00 UTC

svn commit: r1517711 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user: AuthorizableImpl.java MembershipCache.java

Author: tripod
Date: Mon Aug 26 22:04:59 2013
New Revision: 1517711

URL: http://svn.apache.org/r1517711
Log:
Add more timing debug information to memberOf() related calls

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/AuthorizableImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/MembershipCache.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/AuthorizableImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/AuthorizableImpl.java?rev=1517711&r1=1517710&r2=1517711&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/AuthorizableImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/AuthorizableImpl.java Mon Aug 26 22:04:59 2013
@@ -347,7 +347,10 @@ abstract class AuthorizableImpl implemen
         MembershipCache cache = userManager.getMembershipCache();
         String nid = node.getIdentifier();
 
+        final long t0 = System.nanoTime();
+        boolean collect = false;
         if (node.getSession().hasPendingChanges()) {
+            collect = true;
             // avoid retrieving outdated cache entries or filling the cache with
             // invalid data due to group-membership changes pending on the
             // current session.
@@ -360,7 +363,7 @@ abstract class AuthorizableImpl implemen
             //  retrieve cached membership. there are no pending changes.
             groupNodeIds = (includeIndirect) ? cache.getMemberOf(nid) : cache.getDeclaredMemberOf(nid);
         }
-
+        final long t1 = System.nanoTime();
         Set<Group> groups = new HashSet<Group>(groupNodeIds.size());
         for (String identifier : groupNodeIds) {
             try {
@@ -371,6 +374,19 @@ abstract class AuthorizableImpl implemen
                 // group node doesn't exist or cannot be read -> ignore.
             }
         }
+        final long t2 = System.nanoTime();
+        if (log.isDebugEnabled()) {
+            log.debug("Collected {} {} group ids for [{}] in {}us, loaded {} groups in {}us (collect={}, cachesize={})", new Object[]{
+                    groupNodeIds.size(),
+                    includeIndirect ? "all" : "declared",
+                    getID(),
+                    (t1-t0) / 1000,
+                    groups.size(),
+                    (t2-t1) / 1000,
+                    collect,
+                    cache.getSize()
+            });
+        }
         return new RangeIteratorAdapter(groups.iterator(), groups.size());
     }
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/MembershipCache.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/MembershipCache.java?rev=1517711&r1=1517710&r2=1517711&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/MembershipCache.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/security/user/MembershipCache.java Mon Aug 26 22:04:59 2013
@@ -57,6 +57,16 @@ public class MembershipCache implements 
      */
     private static final Logger log = LoggerFactory.getLogger(MembershipCache.class);
 
+    /**
+     * The initial size of this cache (TODO: make configurable)
+     */
+    private static final int MAX_INITIAL_CACHE_SIZE = 1024;
+
+    /**
+     * The maximum size of this cache (TODO: make configurable)
+     */
+    private static final int MAX_CACHE_SIZE = 5000;
+
     private final SessionImpl systemSession;
     private final String groupsPath;
     private final boolean useMembersNode;
@@ -70,7 +80,7 @@ public class MembershipCache implements 
         this.useMembersNode = useMembersNode;
 
         pMembers = systemSession.getJCRName(UserManagerImpl.P_MEMBERS);
-        cache = new GrowingLRUMap(1024, 5000);
+        cache = new GrowingLRUMap(MAX_INITIAL_CACHE_SIZE, MAX_CACHE_SIZE);
 
         String[] ntNames = new String[] {
                 systemSession.getJCRName(UserConstants.NT_REP_GROUP),
@@ -87,6 +97,7 @@ public class MembershipCache implements 
         // make sure the membership cache is informed if the system session is
         // logged out in order to stop listening to events.
         systemSession.addListener(this);
+        log.debug("Membership cache initialized. Max Size = {}", MAX_CACHE_SIZE);
     }
 
 
@@ -135,6 +146,7 @@ public class MembershipCache implements 
             synchronized (cache) {
                 cache.clear();
             }
+            log.debug("Membership cache cleared because of observation event.");
         }
     }
 
@@ -184,6 +196,14 @@ public class MembershipCache implements 
     }
 
     /**
+     * Returns the size of the membership cache
+     * @return the size
+     */
+    synchronized int getSize() {
+        return cache.size();
+    }
+
+    /**
      * Collects the declared memberships for the specified identifier of an
      * authorizable using the specified session.
      * 
@@ -195,9 +215,30 @@ public class MembershipCache implements 
      * @throws RepositoryException If an error occurs.
      */
     Collection<String> collectDeclaredMembership(String authorizableNodeIdentifier, Session session) throws RepositoryException {
+        final long t0 = System.nanoTime();
+
         Collection<String> groupNodeIds = collectDeclaredMembershipFromReferences(authorizableNodeIdentifier, session);
+
+        final long t1 = System.nanoTime();
+        if (log.isDebugEnabled()) {
+            log.debug("  collected {} groups for {} via references in {}us", new Object[]{
+                    groupNodeIds == null ? -1 : groupNodeIds.size(),
+                    authorizableNodeIdentifier,
+                    (t1-t0) / 1000
+            });
+        }
+
         if (groupNodeIds == null) {
             groupNodeIds = collectDeclaredMembershipFromTraversal(authorizableNodeIdentifier, session);
+
+            final long t2 = System.nanoTime();
+            if (log.isDebugEnabled()) {
+                log.debug("  collected {} groups for {} via traversal in {}us", new Object[]{
+                        groupNodeIds == null ? -1 : groupNodeIds.size(),
+                        authorizableNodeIdentifier,
+                        (t2-t1) / 1000
+                });
+            }
         }
         return groupNodeIds;
     }
@@ -229,8 +270,13 @@ public class MembershipCache implements 
      * @throws RepositoryException if an error occurs
      */
     private Collection<String> declaredMemberOf(String authorizableNodeIdentifier) throws RepositoryException {
+        final long t0 = System.nanoTime();
+
         Collection<String> groupNodeIds = cache.get(authorizableNodeIdentifier);
+
+        boolean wasCached = true;
         if (groupNodeIds == null) {
+            wasCached = false;
             // retrieve a new session with system-subject in order to avoid
             // concurrent read operations using the system session of this workspace.
             Session session = getSession();
@@ -245,6 +291,17 @@ public class MembershipCache implements 
                 }
             }
         }
+
+        if (log.isDebugEnabled()) {
+            final long t1 = System.nanoTime();
+            log.debug("Membership cache {} {} declared memberships of {} in {}us. cache size = {}", new Object[]{
+                    wasCached ? "returns" : "collected",
+                    groupNodeIds.size(),
+                    authorizableNodeIdentifier,
+                    (t1-t0) / 1000,
+                    cache.size()
+            });
+        }
         return groupNodeIds;
     }