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