Author: tripod
Date: Fri Jan 10 00:42:29 2014
New Revision: 1556998

URL: http://svn.apache.org/r1556998
Log:
OAK-1311 Permission Cache causes non-deterministic access control test failures

- replaced timestamp with mod counter

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionHook.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStore.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionConstants.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java?rev=1556998&r1=1556997&r2=1556998&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionEntryCache.java
 Fri Jan 10 00:42:29 2014
@@ -74,10 +74,10 @@ public class PermissionEntryCache {
             PrincipalPermissionEntries ppe = entries.get(principalName);
             if (ppe == null) {
                 ppe = store.load(principalName);
-//                entries.put(principalName, ppe);
+                entries.put(principalName, ppe);
             } else {
                 if (!verified.contains(principalName)) {
-                    if (store.getTimestamp(principalName) != 
ppe.getTimestamp()) {
+                    if (store.getModCount(principalName) != ppe.getModCount()) 
{
                         ppe = store.load(principalName);
                         entries.put(principalName, ppe);
                     }
@@ -89,13 +89,13 @@ public class PermissionEntryCache {
             Currently this cache only handles entries for the Everyone 
principal.
             TODO: the cache should dynamically cache the principals that are 
used often.
             */
-//            if (EveryonePrincipal.NAME.equals(principalName)) {
-//                // check if base cache has the entries
-//                PrincipalPermissionEntries baseppe = base.get(principalName);
-//                if (baseppe == null || ppe.getTimestamp() > 
baseppe.getTimestamp()) {
-//                    base.put(principalName, ppe);
-//                }
-//            }
+            if (EveryonePrincipal.NAME.equals(principalName)) {
+                // check if base cache has the entries
+                PrincipalPermissionEntries baseppe = base.get(principalName);
+                if (baseppe == null || ppe.getModCount() > 
baseppe.getModCount()) {
+                    base.put(principalName, ppe);
+                }
+            }
             return ppe;
         }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionHook.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionHook.java?rev=1556998&r1=1556997&r2=1556998&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionHook.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionHook.java
 Fri Jan 10 00:42:29 2014
@@ -29,6 +29,7 @@ import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.core.ImmutableRoot;
 import org.apache.jackrabbit.oak.core.ImmutableTree;
@@ -301,8 +302,7 @@ public class PermissionHook implements P
                             }
                         }
                     }
-                    principalRoot.setProperty(REP_NUM_PERMISSIONS, numEntries);
-                    principalRoot.setProperty(REP_TIMESTAMP, 
System.currentTimeMillis());
+                    touch(principalRoot, numEntries);
                 } else {
                     log.error("{} {}: Principal root missing.", msg, this);
                 }
@@ -357,8 +357,7 @@ public class PermissionHook implements P
                 }
                 long numEntries = 
PermissionUtil.getNumPermissions(principalRoot);
                 numEntries+= updateEntries(parent, entries.get(principalName));
-                principalRoot.setProperty(REP_NUM_PERMISSIONS, numEntries);
-                principalRoot.setProperty(REP_TIMESTAMP, 
System.currentTimeMillis());
+                touch(principalRoot, numEntries);
             }
         }
 
@@ -377,6 +376,12 @@ public class PermissionHook implements P
             }
             return numEntries;
         }
+
+        private void touch(NodeBuilder node, long numEntries) {
+            PropertyState ps = node.getProperty(REP_MOD_COUNT);
+            node.setProperty(REP_MOD_COUNT, ps == null ? 1 : 
ps.getValue(Type.LONG) + 1);
+            node.setProperty(REP_NUM_PERMISSIONS, numEntries);
+        }
     }
 
     private final class AcEntry {

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStore.java?rev=1556998&r1=1556997&r2=1556998&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStore.java
 Fri Jan 10 00:42:29 2014
@@ -38,5 +38,5 @@ public interface PermissionStore {
 
     long getNumEntries(@Nonnull String principalName);
 
-    long getTimestamp(@Nonnull String principalName);
+    long getModCount(@Nonnull String principalName);
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreImpl.java?rev=1556998&r1=1556997&r2=1556998&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionStoreImpl.java
 Fri Jan 10 00:42:29 2014
@@ -114,10 +114,10 @@ public class PermissionStoreImpl impleme
     }
 
     @Override
-    public long getTimestamp(@Nonnull String principalName) {
+    public long getModCount(@Nonnull String principalName) {
         Tree principalRoot = getPrincipalRoot(principalName);
         if (principalRoot != null) {
-            PropertyState ps = 
principalRoot.getProperty(PermissionConstants.REP_TIMESTAMP);
+            PropertyState ps = 
principalRoot.getProperty(PermissionConstants.REP_MOD_COUNT);
             if (ps != null) {
                 return ps.getValue(Type.LONG);
             }
@@ -134,8 +134,8 @@ public class PermissionStoreImpl impleme
             for (Tree entryTree : principalRoot.getChildren()) {
                 loadPermissionEntries(entryTree, ret.getEntries(), 
restrictionProvider);
             }
-            PropertyState ps = 
principalRoot.getProperty(PermissionConstants.REP_TIMESTAMP);
-            ret.setTimestamp(ps == null ? System.currentTimeMillis() : 
ps.getValue(Type.LONG));
+            PropertyState ps = 
principalRoot.getProperty(PermissionConstants.REP_MOD_COUNT);
+            ret.setModCount(ps == null ? -1 : ps.getValue(Type.LONG));
         }
         return ret;
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java?rev=1556998&r1=1556997&r2=1556998&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/PrincipalPermissionEntries.java
 Fri Jan 10 00:42:29 2014
@@ -35,7 +35,7 @@ public class PrincipalPermissionEntries 
     /**
      * timestamp of the per-principal permission store
      */
-    private long timestamp;
+    private long modCount;
 
     /**
      * map of permission entries, accessed by path
@@ -51,12 +51,12 @@ public class PrincipalPermissionEntries 
         return name;
     }
 
-    public long getTimestamp() {
-        return timestamp;
+    public long getModCount() {
+        return modCount;
     }
 
-    public void setTimestamp(long timestamp) {
-        this.timestamp = timestamp;
+    public void setModCount(long modCount) {
+        this.modCount = modCount;
     }
 
     @Nonnull

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionConstants.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionConstants.java?rev=1556998&r1=1556997&r2=1556998&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionConstants.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/permission/PermissionConstants.java
 Fri Jan 10 00:42:29 2014
@@ -38,7 +38,7 @@ public interface PermissionConstants {
 
     String REP_ACCESS_CONTROLLED_PATH = "rep:accessControlledPath";
     String REP_NUM_PERMISSIONS = "rep:numPermissions";
-    String REP_TIMESTAMP = "rep:timestamp";
+    String REP_MOD_COUNT = "rep:modCount";
        String REP_IS_ALLOW = "rep:isAllow";
     String REP_PRIVILEGE_BITS = "rep:privileges";
 


Reply via email to