Author: stillalex Date: Thu Oct 25 14:56:10 2018 New Revision: 1844835 URL: http://svn.apache.org/viewvc?rev=1844835&view=rev Log: OAK-7862 Make PermissionEntryCache more resilient against OOME (1.8)
Modified: jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java Modified: jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java?rev=1844835&r1=1844834&r2=1844835&view=diff ============================================================================== --- jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java (original) +++ jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java Thu Oct 25 14:56:10 2018 @@ -17,7 +17,6 @@ package org.apache.jackrabbit.oak.security.authorization.permission; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -81,15 +80,15 @@ class PermissionEntryCache { ppe = new PrincipalPermissionEntries(); entries.put(principalName, ppe); } - Collection<PermissionEntry> pes = ppe.getEntries().get(path); + Collection<PermissionEntry> pes = ppe.getEntriesByPath(path); if (pes == null) { pes = store.load(null, principalName, path); if (pes == null) { - pes = Collections.emptySet(); + ppe.rememberNotAccessControlled(path); } else { + ppe.putEntriesByPath(path, pes); ret.addAll(pes); } - ppe.getEntries().put(path, pes); } else { ret.addAll(pes); } Modified: jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java?rev=1844835&r1=1844834&r2=1844835&view=diff ============================================================================== --- jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java (original) +++ jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java Thu Oct 25 14:56:10 2018 @@ -16,10 +16,15 @@ */ package org.apache.jackrabbit.oak.security.authorization.permission; +import static java.util.Collections.emptySet; + import java.util.Collection; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; + import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * {@code PermissionEntries} holds the permission entries of one principal @@ -27,6 +32,11 @@ import javax.annotation.Nonnull; class PrincipalPermissionEntries { /** + * max size of the emptyPaths cache. + */ + private static int MAX_SIZE = Integer.getInteger("oak.PrincipalPermissionEntries.maxSize", 1000); + + /** * indicating if all entries were loaded. */ private boolean fullyLoaded; @@ -34,13 +44,20 @@ class PrincipalPermissionEntries { /** * map of permission entries, accessed by path */ - private Map<String, Collection<PermissionEntry>> entries = new HashMap<String, Collection<PermissionEntry>>(); + private Map<String, Collection<PermissionEntry>> entries = new HashMap<>(); + private final Map<String, Boolean> emptyPaths; PrincipalPermissionEntries() { + this.emptyPaths = new LinkedHashMap<String, Boolean>() { + @Override + protected boolean removeEldestEntry(Map.Entry<String, Boolean> eldest) { + return size() > MAX_SIZE; + } + }; } long getSize() { - return entries.size(); + return entries.size() + emptyPaths.size(); } boolean isFullyLoaded() { @@ -55,4 +72,17 @@ class PrincipalPermissionEntries { Map<String, Collection<PermissionEntry>> getEntries() { return entries; } + + @Nullable + Collection<PermissionEntry> getEntriesByPath(@Nonnull String path) { + return (emptyPaths.containsKey(path)) ? emptySet() : entries.get(path); + } + + void putEntriesByPath(@Nonnull String path, @Nonnull Collection<PermissionEntry> pathEntries) { + entries.put(path, pathEntries); + } + + void rememberNotAccessControlled(@Nonnull String path) { + emptyPaths.put(path, null); + } } \ No newline at end of file