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