This is an automated email from the ASF dual-hosted git repository.

abhay pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new c0480ed72 RANGER-4905:Reduce memory needed to create Ranger policy 
engine
c0480ed72 is described below

commit c0480ed72656d56cf2e5ab03bbea37e372363081
Author: Abhay Kulkarni <[email protected]>
AuthorDate: Thu Aug 15 09:57:56 2024 -0700

    RANGER-4905:Reduce memory needed to create Ranger policy engine
---
 .../plugin/contextenricher/RangerTagEnricher.java  | 13 ++--
 .../validation/RangerSecurityZoneValidator.java    |  2 +-
 .../validation/RangerZoneResourceMatcher.java      |  8 ++-
 .../ranger/plugin/policyengine/PolicyEngine.java   |  1 +
 .../plugin/policyengine/RangerPluginContext.java   | 75 ++++++++++++++++++++--
 .../policyengine/RangerPolicyEngineOptions.java    | 10 +++
 .../policyengine/RangerSecurityZoneMatcher.java    |  2 +-
 .../policyengine/gds/GdsDataShareEvaluator.java    |  5 +-
 .../plugin/policyengine/gds/GdsPolicyEngine.java   |  2 +-
 .../gds/GdsSharedResourceEvaluator.java            |  8 ++-
 .../RangerAbstractPolicyEvaluator.java             |  1 +
 .../RangerDefaultPolicyResourceMatcher.java        | 51 ++++++++++-----
 .../RangerPolicyResourceMatcher.java               |  3 +
 .../org/apache/ranger/sizing/RangerMemSizing.java  | 22 ++++---
 14 files changed, 155 insertions(+), 48 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
index 2fa24eba6..a8fbc0215 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/contextenricher/RangerTagEnricher.java
@@ -29,11 +29,7 @@ import org.apache.ranger.plugin.model.RangerServiceDef;
 import org.apache.ranger.plugin.model.RangerServiceResource;
 import org.apache.ranger.plugin.model.RangerTag;
 import org.apache.ranger.plugin.model.validation.RangerServiceDefHelper;
-import org.apache.ranger.plugin.policyengine.RangerAccessRequest;
-import org.apache.ranger.plugin.policyengine.RangerAccessRequestImpl;
-import org.apache.ranger.plugin.policyengine.RangerAccessResource;
-import org.apache.ranger.plugin.policyengine.RangerAccessResourceImpl;
-import org.apache.ranger.plugin.policyengine.RangerResourceTrie;
+import org.apache.ranger.plugin.policyengine.*;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerPolicyResourceMatcher;
 import org.apache.ranger.plugin.util.DownloadTrigger;
@@ -437,7 +433,7 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
 
                        for (ListIterator<RangerServiceResource> iter = 
serviceResources.listIterator(); iter.hasNext(); ) {
                                RangerServiceResource        serviceResource    
    = iter.next();
-                               RangerServiceResourceMatcher 
serviceResourceMatcher = createRangerServiceResourceMatcher(serviceResource, 
serviceDefHelper, hierarchies);
+                               RangerServiceResourceMatcher 
serviceResourceMatcher = createRangerServiceResourceMatcher(serviceResource, 
serviceDefHelper, hierarchies, getPluginContext());
 
                                if (serviceResourceMatcher != null) {
                                        
resourceMatchers.add(serviceResourceMatcher);
@@ -484,7 +480,7 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
 
                        if (removedOldServiceResource) {
                                if 
(!StringUtils.isEmpty(serviceResource.getResourceSignature())) {
-                                       RangerServiceResourceMatcher 
resourceMatcher = createRangerServiceResourceMatcher(serviceResource, 
serviceDefHelper, hierarchies);
+                                       RangerServiceResourceMatcher 
resourceMatcher = createRangerServiceResourceMatcher(serviceResource, 
serviceDefHelper, hierarchies, getPluginContext());
 
                                        if (resourceMatcher != null) {
                                                for 
(RangerServiceDef.RangerResourceDef resourceDef : serviceDef.getResources()) {
@@ -613,7 +609,7 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
                return ret;
        }
 
-       static public RangerServiceResourceMatcher 
createRangerServiceResourceMatcher(RangerServiceResource serviceResource, 
RangerServiceDefHelper serviceDefHelper, ResourceHierarchies hierarchies) {
+       static public RangerServiceResourceMatcher 
createRangerServiceResourceMatcher(RangerServiceResource serviceResource, 
RangerServiceDefHelper serviceDefHelper, ResourceHierarchies hierarchies, 
RangerPluginContext pluginContext) {
 
                if (LOG.isDebugEnabled()) {
                        LOG.debug("==> 
createRangerServiceResourceMatcher(serviceResource=" + serviceResource + ")");
@@ -644,6 +640,7 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
 
                                
matcher.setServiceDef(serviceDefHelper.getServiceDef());
                                
matcher.setPolicyResources(serviceResource.getResourceElements(), policyType);
+                               matcher.setPluginContext(pluginContext);
 
                                if (LOG.isDebugEnabled()) {
                                        
LOG.debug("RangerTagEnricher.setServiceTags() - Initializing matcher with 
(resource=" + serviceResource
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerSecurityZoneValidator.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerSecurityZoneValidator.java
index 360426198..b88ac21a6 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerSecurityZoneValidator.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerSecurityZoneValidator.java
@@ -354,7 +354,7 @@ public class RangerSecurityZoneValidator extends 
RangerValidator {
                     policyResources.put(resourceDefName, policyResource);
                 }
 
-                RangerZoneResourceMatcher matcher = new 
RangerZoneResourceMatcher(zone.getName(), policyResources, serviceDefHelper);
+                RangerZoneResourceMatcher matcher = new 
RangerZoneResourceMatcher(zone.getName(), policyResources, serviceDefHelper, 
null);
 
                 matchers.add(matcher);
                 resourceNames.addAll(policyResources.keySet());
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerZoneResourceMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerZoneResourceMatcher.java
index bf4247660..1a8a867a0 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerZoneResourceMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/validation/RangerZoneResourceMatcher.java
@@ -21,6 +21,7 @@ package org.apache.ranger.plugin.model.validation;
 
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerServiceDef;
+import org.apache.ranger.plugin.policyengine.RangerPluginContext;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerPolicyResourceMatcher;
 import org.apache.ranger.plugin.policyresourcematcher.RangerResourceEvaluator;
@@ -41,17 +42,18 @@ public class RangerZoneResourceMatcher implements 
RangerResourceEvaluator {
     private final RangerPolicyResourceMatcher                    
policyResourceMatcher;
     private RangerServiceDef.RangerResourceDef                   
leafResourceDef;
 
-    public RangerZoneResourceMatcher(final String securityZoneName, final 
Map<String, RangerPolicy.RangerPolicyResource> policyResource, final 
RangerServiceDef serviceDef) {
-        this(securityZoneName, policyResource, new 
RangerServiceDefHelper(serviceDef));
+    public RangerZoneResourceMatcher(final String securityZoneName, final 
Map<String, RangerPolicy.RangerPolicyResource> policyResource, final 
RangerServiceDef serviceDef, RangerPluginContext pluginContext) {
+        this(securityZoneName, policyResource, new 
RangerServiceDefHelper(serviceDef), pluginContext);
     }
 
-    public RangerZoneResourceMatcher(final String securityZoneName, final 
Map<String, RangerPolicy.RangerPolicyResource> policyResource, final 
RangerServiceDefHelper serviceDefHelper) {
+    public RangerZoneResourceMatcher(final String securityZoneName, final 
Map<String, RangerPolicy.RangerPolicyResource> policyResource, final 
RangerServiceDefHelper serviceDefHelper, RangerPluginContext pluginContext) {
         final RangerServiceDef                   serviceDef   = 
serviceDefHelper.getServiceDef();
         final Collection<String>                 resourceKeys = 
policyResource.keySet();
         final RangerDefaultPolicyResourceMatcher matcher      = new 
RangerDefaultPolicyResourceMatcher();
 
         matcher.setServiceDef(serviceDef);
         matcher.setServiceDefHelper(serviceDefHelper);
+        matcher.setPluginContext(pluginContext);
 
         boolean found = false;
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/PolicyEngine.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/PolicyEngine.java
index 704434b8e..2de3cfa0d 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/PolicyEngine.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/PolicyEngine.java
@@ -197,6 +197,7 @@ public class PolicyEngine {
         }
 
         normalizeServiceDefs(servicePolicies);
+        pluginContext.cleanResourceMatchers();
 
         this.pluginContext = pluginContext;
         this.lock          = new RangerReadWriteLock(isUseReadWriteLock);
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java
index 5f086ed49..8a3e43e48 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPluginContext.java
@@ -23,18 +23,26 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.admin.client.RangerAdminClient;
 import org.apache.ranger.admin.client.RangerAdminRESTClient;
 import org.apache.ranger.authorization.hadoop.config.RangerPluginConfig;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher;
 import org.apache.ranger.plugin.service.RangerAuthContext;
 import org.apache.ranger.plugin.service.RangerAuthContextListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
 public class RangerPluginContext {
        private static final Logger LOG = 
LoggerFactory.getLogger(RangerPluginContext.class);
 
-       private final RangerPluginConfig        config;
-       private       RangerAuthContext         authContext;
-       private       RangerAuthContextListener authContextListener;
-       private           RangerAdminClient         adminClient;
+       private final    RangerPluginConfig                                     
                    config;
+       private          RangerAuthContext                                      
                    authContext;
+       private          RangerAuthContextListener                              
                    authContextListener;
+       private          RangerAdminClient                                      
                    adminClient;
+       private final    Map<String, Map<RangerPolicy.RangerPolicyResource, 
RangerResourceMatcher>> resourceMatchers = new HashMap<>();
+       private final    ReentrantReadWriteLock                                 
                    lock = new ReentrantReadWriteLock(true); // fair lock
 
 
        public RangerPluginContext(RangerPluginConfig config) {
@@ -53,6 +61,65 @@ public class RangerPluginContext {
 
        public RangerAuthContext getAuthContext() { return authContext; }
 
+       public RangerResourceMatcher getResourceMatcher(String resourceDefName, 
RangerPolicy.RangerPolicyResource resource) {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> getResourceMatcher(resourceDefName={}, 
resource={})", resourceDefName, resource);
+               }
+               RangerResourceMatcher ret = null;
+
+               try {
+                       lock.readLock().lock();
+
+                       Map<RangerPolicy.RangerPolicyResource, 
RangerResourceMatcher> matchersForResource = 
resourceMatchers.get(resourceDefName);
+
+                       if (matchersForResource != null) {
+                               ret = matchersForResource.get(resource);
+                       }
+               } finally {
+                       lock.readLock().unlock();
+               }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== getResourceMatcher(resourceDefName={}, 
resource={}) : ret={}", resourceDefName, resource, ret);
+               }
+
+               return ret;
+       }
+
+       public void setResourceMatcher(String resourceDefName, 
RangerPolicy.RangerPolicyResource resource, RangerResourceMatcher matcher) {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> setResourceMatcher(resourceDefName={}, 
resource={}, matcher={})", resourceDefName, resource, matcher);
+               }
+               if (config != null && 
config.getPolicyEngineOptions().enableResourceMatcherReuse) {
+                       try {
+                               lock.writeLock().lock();
+
+                               Map<RangerPolicy.RangerPolicyResource, 
RangerResourceMatcher> matchersForResource = 
resourceMatchers.computeIfAbsent(resourceDefName, k -> new HashMap<>());
+                               matchersForResource.put(resource, matcher);
+                       } finally {
+                               lock.writeLock().unlock();
+                       }
+               }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== setResourceMatcher(resourceDefName={}, 
resource={}, matcher={})", resourceDefName, resource, matcher);
+               }
+       }
+
+       void cleanResourceMatchers() {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("==> cleanResourceMatchers()");
+               }
+               try {
+                       lock.writeLock().lock();
+
+                       resourceMatchers.clear();
+               } finally {
+                       lock.writeLock().unlock();
+               }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<== cleanResourceMatchers()");
+               }
+       }
+
        public void setAuthContext(RangerAuthContext authContext) { 
this.authContext = authContext; }
 
        public void setAuthContextListener(RangerAuthContextListener 
authContextListener) { this.authContextListener = authContextListener; }
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineOptions.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineOptions.java
index f881eaa14..251fb41cf 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineOptions.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyEngineOptions.java
@@ -37,6 +37,7 @@ public class RangerPolicyEngineOptions {
        public boolean evaluateDelegateAdminOnly = false;
        public boolean enableTagEnricherWithLocalRefresher = false;
        public boolean enableUserStoreEnricherWithLocalRefresher = false;
+       public boolean enableResourceMatcherReuse = true;
        @Deprecated
        public boolean disableAccessEvaluationWithPolicyACLSummary = true;
        public boolean optimizeTrieForRetrieval = false;
@@ -63,6 +64,7 @@ public class RangerPolicyEngineOptions {
                this.evaluateDelegateAdminOnly = 
other.evaluateDelegateAdminOnly;
                this.enableTagEnricherWithLocalRefresher = 
other.enableTagEnricherWithLocalRefresher;
                this.enableUserStoreEnricherWithLocalRefresher = 
other.enableUserStoreEnricherWithLocalRefresher;
+               this.enableResourceMatcherReuse = 
other.enableResourceMatcherReuse;
                this.optimizeTrieForRetrieval = other.optimizeTrieForRetrieval;
                this.disableRoleResolution = other.disableRoleResolution;
                this.serviceDefHelper = null;
@@ -88,6 +90,7 @@ public class RangerPolicyEngineOptions {
                disableGdsInfoRetriever = conf.getBoolean(propertyPrefix + 
".policyengine.option.disable.gdsinfo.retriever", false);
 
                cacheAuditResults = conf.getBoolean(propertyPrefix + 
".policyengine.option.cache.audit.results", true);
+               enableResourceMatcherReuse = conf.getBoolean(propertyPrefix + 
".policyengine.option.enable.resourcematcher.reuse", true);
 
                if (!disableTrieLookupPrefilter) {
                        cacheAuditResults = false;
@@ -119,6 +122,7 @@ public class RangerPolicyEngineOptions {
                enableUserStoreEnricherWithLocalRefresher = false;
                optimizeTrieForRetrieval = conf.getBoolean(propertyPrefix + 
".policyengine.option.optimize.trie.for.retrieval", false);
                disableRoleResolution = conf.getBoolean(propertyPrefix + 
".policyengine.option.disable.role.resolution", true);
+               enableResourceMatcherReuse = conf.getBoolean(propertyPrefix + 
".policyengine.option.enable.resourcematcher.reuse", true);
        }
 
        public void configureDelegateAdmin(Configuration conf, String 
propertyPrefix) {
@@ -131,6 +135,7 @@ public class RangerPolicyEngineOptions {
                disableUserStoreRetriever = conf.getBoolean(propertyPrefix + 
".policyengine.option.disable.userstore.retriever", true);
                disableGdsInfoRetriever = conf.getBoolean(propertyPrefix + 
".policyengine.option.disable.gdsinfo.retriever", true);
                optimizeTrieForRetrieval = conf.getBoolean(propertyPrefix + 
".policyengine.option.optimize.trie.for.retrieval", false);
+               enableResourceMatcherReuse = conf.getBoolean(propertyPrefix + 
".policyengine.option.enable.resourcematcher.reuse", true);
 
                cacheAuditResults = false;
                evaluateDelegateAdminOnly = true;
@@ -157,6 +162,7 @@ public class RangerPolicyEngineOptions {
                optimizeTrieForSpace = conf.getBoolean(propertyPrefix + 
".policyengine.option.optimize.trie.for.space", false);
                optimizeTagTrieForRetrieval = conf.getBoolean(propertyPrefix + 
".policyengine.option.optimize.tag.trie.for.retrieval", false);
                optimizeTagTrieForSpace = conf.getBoolean(propertyPrefix + 
".policyengine.option.optimize.tag.trie.for.space", true);
+               enableResourceMatcherReuse = conf.getBoolean(propertyPrefix + 
".policyengine.option.enable.resourcematcher.reuse", true);
        }
 
        public RangerServiceDefHelper getServiceDefHelper() {
@@ -194,6 +200,7 @@ public class RangerPolicyEngineOptions {
                                        && this.optimizeTrieForSpace == 
that.optimizeTrieForSpace
                                        && this.optimizeTagTrieForRetrieval == 
that.optimizeTagTrieForRetrieval
                                        && this.optimizeTagTrieForSpace == 
that.optimizeTagTrieForSpace
+                                       && this.enableResourceMatcherReuse == 
that.enableResourceMatcherReuse
                        ;
                }
                return ret;
@@ -236,6 +243,8 @@ public class RangerPolicyEngineOptions {
                ret *= 2;
                ret += optimizeTagTrieForSpace ? 1 : 0;
                ret *= 2;
+               ret += enableResourceMatcherReuse ? 1 : 0;
+               ret *= 2;
                return ret;
        }
 
@@ -260,6 +269,7 @@ public class RangerPolicyEngineOptions {
                                ", optimizeTrieForSpace: " + 
optimizeTrieForSpace +
                                ", optimizeTagTrieForRetrieval: " + 
optimizeTagTrieForRetrieval +
                                ", optimizeTagTrieForSpace: " + 
optimizeTagTrieForSpace +
+                               ", enableResourceMatcherReuse: " + 
enableResourceMatcherReuse +
                                " }";
 
        }
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerSecurityZoneMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerSecurityZoneMatcher.java
index 822bb3902..0d44f7109 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerSecurityZoneMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerSecurityZoneMatcher.java
@@ -171,7 +171,7 @@ public class RangerSecurityZoneMatcher {
                         policyResources.put(resourceDefName, new 
RangerPolicyResource(resourceValues, false, isRecursive));
                     }
 
-                    matchers.add(new RangerZoneResourceMatcher(zoneName, 
policyResources, serviceDef));
+                    matchers.add(new RangerZoneResourceMatcher(zoneName, 
policyResources, serviceDef, pluginContext));
 
                     if (LOG.isDebugEnabled()) {
                         LOG.debug("Built matcher for resource:[{}] in 
zone:[{}]", resource, zoneName);
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDataShareEvaluator.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDataShareEvaluator.java
index 1c608aa3b..df4d06018 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDataShareEvaluator.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsDataShareEvaluator.java
@@ -24,6 +24,7 @@ import 
org.apache.ranger.plugin.conditionevaluator.RangerConditionEvaluator;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerResourceDef;
 import org.apache.ranger.plugin.model.validation.RangerServiceDefHelper;
 import org.apache.ranger.plugin.policyengine.RangerAccessRequest;
+import org.apache.ranger.plugin.policyengine.RangerPluginContext;
 import org.apache.ranger.plugin.policyengine.RangerResourceACLs;
 import org.apache.ranger.plugin.policyengine.RangerResourceTrie;
 import org.apache.ranger.plugin.policyevaluator.RangerCustomConditionEvaluator;
@@ -48,7 +49,7 @@ public class GdsDataShareEvaluator {
     private final Map<String, RangerResourceTrie<GdsSharedResourceEvaluator>> 
resourceTries;
     private final List<GdsDshidEvaluator>                                     
dsidEvaluators = new ArrayList<>();
 
-    public GdsDataShareEvaluator(DataShareInfo dsh, List<SharedResourceInfo> 
resources, RangerServiceDefHelper serviceDefHelper) {
+    public GdsDataShareEvaluator(DataShareInfo dsh, List<SharedResourceInfo> 
resources, RangerServiceDefHelper serviceDefHelper, RangerPluginContext 
pluginContext) {
         LOG.debug("==> GdsDataShareEvaluator({}, {})", dsh, resources);
 
         this.dsh                = dsh;
@@ -63,7 +64,7 @@ public class GdsDataShareEvaluator {
             resourceTries = new HashMap<>();
 
             for (SharedResourceInfo resource : resources) {
-                GdsSharedResourceEvaluator evaluator = new 
GdsSharedResourceEvaluator(resource, dsh.getDefaultAccessTypes(), 
serviceDefHelper);
+                GdsSharedResourceEvaluator evaluator = new 
GdsSharedResourceEvaluator(resource, dsh.getDefaultAccessTypes(), 
serviceDefHelper, pluginContext);
 
                 evaluators.add(evaluator);
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsPolicyEngine.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsPolicyEngine.java
index 53843136c..a1593daaf 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsPolicyEngine.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsPolicyEngine.java
@@ -261,7 +261,7 @@ public class GdsPolicyEngine {
 
         if (gdsInfo.getDataShares() != null) {
             for (DataShareInfo dsh : gdsInfo.getDataShares()) {
-                GdsDataShareEvaluator       dshEvaluator   = new 
GdsDataShareEvaluator(dsh, dshResources.get(dsh.getId()), serviceDefHelper);
+                GdsDataShareEvaluator       dshEvaluator   = new 
GdsDataShareEvaluator(dsh, dshResources.get(dsh.getId()), serviceDefHelper, 
pluginContext);
                 List<GdsDataShareEvaluator> zoneEvaluators = 
zoneDataShares.computeIfAbsent(dshEvaluator.getZoneName(), k -> new 
ArrayList<>());
 
                 zoneEvaluators.add(dshEvaluator);
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsSharedResourceEvaluator.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsSharedResourceEvaluator.java
index 9785d4b25..c2773c9e0 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsSharedResourceEvaluator.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/gds/GdsSharedResourceEvaluator.java
@@ -29,6 +29,7 @@ import 
org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerResourceDef;
 import org.apache.ranger.plugin.model.validation.RangerServiceDefHelper;
 import org.apache.ranger.plugin.policyengine.RangerAccessRequest;
+import org.apache.ranger.plugin.policyengine.RangerPluginContext;
 import org.apache.ranger.plugin.policyengine.RangerResourceACLs;
 import org.apache.ranger.plugin.policyevaluator.RangerCustomConditionEvaluator;
 import 
org.apache.ranger.plugin.policyresourcematcher.RangerDefaultPolicyResourceMatcher;
@@ -55,7 +56,7 @@ public class GdsSharedResourceEvaluator implements 
RangerResourceEvaluator {
     private final RangerResourceDef                 leafResourceDef;
     private final Set<String>                       allowedAccessTypes;
 
-    public GdsSharedResourceEvaluator(SharedResourceInfo resource, Set<String> 
defaultAccessTypes, RangerServiceDefHelper serviceDefHelper) {
+    public GdsSharedResourceEvaluator(SharedResourceInfo resource, Set<String> 
defaultAccessTypes, RangerServiceDefHelper serviceDefHelper, 
RangerPluginContext pluginContext) {
         this.resource           = resource;
         this.conditionEvaluator = 
RangerCustomConditionEvaluator.getInstance().getExpressionEvaluator(resource.getConditionExpr(),
 serviceDefHelper.getServiceDef());
 
@@ -71,7 +72,7 @@ public class GdsSharedResourceEvaluator implements 
RangerResourceEvaluator {
             this.policyResource = resource.getResource();
         }
 
-        this.policyResourceMatcher = initPolicyResourceMatcher(policyResource, 
serviceDefHelper);
+        this.policyResourceMatcher = initPolicyResourceMatcher(policyResource, 
serviceDefHelper, pluginContext);
         this.leafResourceDef       = 
ServiceDefUtil.getLeafResourceDef(serviceDefHelper.getServiceDef(), 
policyResource);
         this.allowedAccessTypes    = 
serviceDefHelper.expandImpliedAccessGrants(resource.getAccessTypes() != null ? 
resource.getAccessTypes() : defaultAccessTypes);
 
@@ -170,12 +171,13 @@ public class GdsSharedResourceEvaluator implements 
RangerResourceEvaluator {
         return resource.getSubResourceMasks() != null ? 
resource.getSubResourceMasks().get(subResourceName) : null;
     }
 
-    private static RangerPolicyResourceMatcher 
initPolicyResourceMatcher(Map<String, RangerPolicyResource> policyResource, 
RangerServiceDefHelper serviceDefHelper) {
+    private static RangerPolicyResourceMatcher 
initPolicyResourceMatcher(Map<String, RangerPolicyResource> policyResource, 
RangerServiceDefHelper serviceDefHelper, RangerPluginContext pluginContext) {
         RangerDefaultPolicyResourceMatcher matcher = new 
RangerDefaultPolicyResourceMatcher();
 
         matcher.setServiceDefHelper(serviceDefHelper);
         matcher.setServiceDef(serviceDefHelper.getServiceDef());
         matcher.setPolicyResources(policyResource, 
RangerPolicy.POLICY_TYPE_ACCESS);
+        matcher.setPluginContext(pluginContext);
 
         matcher.init();
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyEvaluator.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyEvaluator.java
index 07fe6a38d..549dc8f5a 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyEvaluator.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyevaluator/RangerAbstractPolicyEvaluator.java
@@ -542,6 +542,7 @@ public abstract class RangerAbstractPolicyEvaluator 
implements RangerPolicyEvalu
                        this.resourceMatcher.setPolicyResources(resource, 
policyType);
                        this.resourceMatcher.setServiceDef(serviceDef);
                        
this.resourceMatcher.setServiceDefHelper(serviceDefHelper);
+                       this.resourceMatcher.setPluginContext(pluginContext);
                        this.resourceMatcher.init();
                }
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
index f16157ce6..0c377b357 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerDefaultPolicyResourceMatcher.java
@@ -37,6 +37,7 @@ import 
org.apache.ranger.plugin.model.validation.RangerServiceDefHelper;
 import 
org.apache.ranger.plugin.policyengine.RangerAccessRequest.ResourceElementMatchingScope;
 import org.apache.ranger.plugin.policyengine.RangerAccessResource;
 import org.apache.ranger.plugin.policyengine.RangerAccessResourceImpl;
+import org.apache.ranger.plugin.policyengine.RangerPluginContext;
 import org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher;
 import org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher;
 import org.apache.ranger.plugin.util.RangerPerfTracer;
@@ -60,6 +61,7 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
     private List<RangerResourceDef>             validResourceHierarchy;
     private boolean                             isInitialized = false;
     private RangerServiceDefHelper              serviceDefHelper;
+    private RangerPluginContext                 pluginContext = null;
 
     private final boolean forceEnableWildcardMatch;
 
@@ -113,6 +115,9 @@ public class RangerDefaultPolicyResourceMatcher implements 
RangerPolicyResourceM
         this.serviceDefHelper = serviceDefHelper;
     }
 
+    @Override
+    public void setPluginContext(RangerPluginContext pluginContext) { 
this.pluginContext = pluginContext; }
+
     public int getPolicyType() { return policyType; }
 
     public RangerServiceDefHelper getServiceDefHelper() {
@@ -812,29 +817,41 @@ public class RangerDefaultPolicyResourceMatcher 
implements RangerPolicyResourceM
             String resName = resourceDef.getName();
             String clsName = resourceDef.getMatcher();
 
-            if (!StringUtils.isEmpty(clsName)) {
-                try {
-                    @SuppressWarnings("unchecked")
-                    Class<RangerResourceMatcher> matcherClass = 
(Class<RangerResourceMatcher>) Class.forName(clsName);
+            if (pluginContext != null) {
+                ret = pluginContext.getResourceMatcher(resName, resource);
+            }
+
+            if (ret == null) {
+                if (!StringUtils.isEmpty(clsName)) {
+                    try {
+                        @SuppressWarnings("unchecked") 
Class<RangerResourceMatcher> matcherClass = (Class<RangerResourceMatcher>) 
Class.forName(clsName);
 
-                    ret = matcherClass.newInstance();
-                } catch (Exception excp) {
-                    LOG.error("failed to instantiate resource matcher '" + 
clsName + "' for '" + resName + "'. Default resource matcher will be used", 
excp);
+                        ret = matcherClass.newInstance();
+                    } catch (Exception excp) {
+                        LOG.error("failed to instantiate resource matcher '" + 
clsName + "' for '" + resName + "'. Default resource matcher will be used", 
excp);
+                    }
                 }
-            }
 
 
-            if (ret == null) {
-                ret = new RangerDefaultResourceMatcher();
-            }
+                if (ret == null) {
+                    ret = new RangerDefaultResourceMatcher();
+                }
 
-            if (forceEnableWildcardMatch && 
!Boolean.parseBoolean(resourceDef.getMatcherOptions().get(OPTION_WILD_CARD))) {
-                resourceDef = 
serviceDefHelper.getWildcardEnabledResourceDef(resourceDef.getName(), 
policyType);
-            }
+                if (forceEnableWildcardMatch && 
!Boolean.parseBoolean(resourceDef.getMatcherOptions().get(OPTION_WILD_CARD))) {
+                    resourceDef = 
serviceDefHelper.getWildcardEnabledResourceDef(resourceDef.getName(), 
policyType);
+                }
 
-            ret.setResourceDef(resourceDef);
-            ret.setPolicyResource(resource);
-            ret.init();
+                ret.setResourceDef(resourceDef);
+                ret.setPolicyResource(resource);
+                ret.init();
+                if (pluginContext != null) {
+                    pluginContext.setResourceMatcher(resName, resource, ret);
+                }
+            } else {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Did not create a fresh matcher - used matcher 
from pluginContext");
+                }
+            }
         } else {
             LOG.error("RangerDefaultPolicyResourceMatcher: RangerResourceDef 
is null");
         }
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
index e1cd89b70..ad6869ad0 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyresourcematcher/RangerPolicyResourceMatcher.java
@@ -28,6 +28,7 @@ import org.apache.ranger.plugin.model.RangerServiceDef;
 import org.apache.ranger.plugin.model.validation.RangerServiceDefHelper;
 import 
org.apache.ranger.plugin.policyengine.RangerAccessRequest.ResourceElementMatchingScope;
 import org.apache.ranger.plugin.policyengine.RangerAccessResource;
+import org.apache.ranger.plugin.policyengine.RangerPluginContext;
 import org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher;
 
 public interface RangerPolicyResourceMatcher {
@@ -48,6 +49,8 @@ public interface RangerPolicyResourceMatcher {
 
        void setServiceDefHelper(RangerServiceDefHelper serviceDefHelper);
 
+       void setPluginContext(RangerPluginContext pluginContext);
+
        RangerServiceDef getServiceDef();
 
        RangerResourceMatcher getResourceMatcher(String resourceName);
diff --git 
a/ranger-tools/src/main/java/org/apache/ranger/sizing/RangerMemSizing.java 
b/ranger-tools/src/main/java/org/apache/ranger/sizing/RangerMemSizing.java
index e4ff6eeca..c8e9e9a70 100644
--- a/ranger-tools/src/main/java/org/apache/ranger/sizing/RangerMemSizing.java
+++ b/ranger-tools/src/main/java/org/apache/ranger/sizing/RangerMemSizing.java
@@ -85,6 +85,7 @@ public class RangerMemSizing {
   private final boolean     deDup;
   private final boolean     deDupStrings;
   private final String      optimizationMode;
+  private final boolean     reuseResourceMatchers;
   private final PrintStream out;
 
   public RangerMemSizing(CommandLine cmdLine) {
@@ -100,6 +101,7 @@ public class RangerMemSizing {
     this.deDup            = Boolean.parseBoolean(cmdLine.getOptionValue("d", 
"true"));
     this.deDupStrings     = this.deDup;
     this.optimizationMode = 
StringUtils.startsWithIgnoreCase(cmdLine.getOptionValue('o', "space"), "s") ? 
OPT_MODE_SPACE : OPT_MODEL_RETRIEVAL;
+    this.reuseResourceMatchers = 
Boolean.parseBoolean(cmdLine.getOptionValue('m', "true"));
   }
 
   public void run() {
@@ -131,31 +133,32 @@ public class RangerMemSizing {
     out.println();
     out.println("Parameters:");
     if (policies != null) {
-      out.println("  Policies:  file=" + policyFile + ", size=" + new 
File(policyFile).length() + ", " + toSummaryStr(policies));
+      out.println("  Policies:      file=" + policyFile + ", size=" + new 
File(policyFile).length() + ", " + toSummaryStr(policies));
     }
 
     if (tags != null) {
-      out.println("  Tags:      file=" + tagFile + ", size=" + new 
File(tagFile).length() + ", " + toSummaryStr(tags));
+      out.println("  Tags:          file=" + tagFile + ", size=" + new 
File(tagFile).length() + ", " + toSummaryStr(tags));
     }
 
     if (roles != null) {
-      out.println("  Roles:     file=" + rolesFile + ", size=" + new 
File(rolesFile).length() + ", " + toSummaryStr(roles));
+      out.println("  Roles:         file=" + rolesFile + ", size=" + new 
File(rolesFile).length() + ", " + toSummaryStr(roles));
     }
 
     if (userStore != null) {
-      out.println("  UserStore: file=" + userStoreFile + ", size=" + new 
File(userStoreFile).length() + ", " + toSummaryStr(userStore));
+      out.println("  UserStore:     file=" + userStoreFile + ", size=" + new 
File(userStoreFile).length() + ", " + toSummaryStr(userStore));
     }
 
     if (genRequestsFile != null) {
-      out.println("  GenReq:    file=" + genRequestsFile + ", requestCount=" + 
genReqCount);
+      out.println("  GenReq:        file=" + genRequestsFile + ", 
requestCount=" + genReqCount);
     }
 
     if (evalRequestsFile != null) {
-      out.println("  EvalReq:   file=" + evalRequestsFile + ", requestCount=" 
+ evalReqCount + ", avgTimeTaken=" + evalAvgTimeNs +  "ns, clientCount=" + 
evalClientsCount);
+      out.println("  EvalReq:       file=" + evalRequestsFile + ", 
requestCount=" + evalReqCount + ", avgTimeTaken=" + evalAvgTimeNs +  "ns, 
clientCount=" + evalClientsCount);
     }
 
-    out.println("  DeDup:     " + deDup);
-    out.println("  OptMode:   " + optimizationMode);
+    out.println("  DeDup:         " + deDup);
+    out.println("  OptMode:       " + optimizationMode);
+    out.println("  ReuseMatchers: " + reuseResourceMatchers);
     out.println();
 
     out.println("Results:");
@@ -561,6 +564,7 @@ public class RangerMemSizing {
     Option evalClients  = new Option("c", "evalClients", true, "eval clients 
count");
     Option gdsInfo      = new Option("g", "gdsInfo", true, "gdsInfo file");
     Option optimizeMode = new Option("o", "optMode", true, "optimization mode: 
space|retrieval");
+    Option reuseResourceMatchers = new Option("m", "reuseResourceMatchers", 
true, "reuse resource matchers: true|false");
 
     Options options = new Options();
 
@@ -575,6 +579,7 @@ public class RangerMemSizing {
     options.addOption(gdsInfo);
     options.addOption(deDup);
     options.addOption(optimizeMode);
+    options.addOption(reuseResourceMatchers);
 
     try {
       CommandLine cmdLine = new DefaultParser().parse(options, args);
@@ -612,6 +617,7 @@ public class RangerMemSizing {
     ret.optimizeTrieForRetrieval    = !ret.optimizeTrieForSpace;
     ret.optimizeTagTrieForSpace     = ret.optimizeTrieForSpace;
     ret.optimizeTagTrieForRetrieval = ret.optimizeTrieForRetrieval;
+    ret.enableResourceMatcherReuse  = reuseResourceMatchers;
 
     return ret;
   }


Reply via email to