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 st...@apache.org on 2018/10/25 14:56:10 UTC
svn commit: r1844835 - in
/jackrabbit/oak/branches/1.8/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission:
PermissionEntryCache.java PrincipalPermissionEntries.java
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