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 afb1f20  RANGER-2651: Improve performance of building and querying 
RangerResourceTrie
afb1f20 is described below

commit afb1f208557dbe308d0e2c5fdbe833fcbffb6111
Author: Abhay Kulkarni <[email protected]>
AuthorDate: Mon Nov 25 18:11:45 2019 -0800

    RANGER-2651: Improve performance of building and querying RangerResourceTrie
---
 .../plugin/contextenricher/RangerTagEnricher.java  |  36 +++----
 .../validation/RangerSecurityZoneValidator.java    |  12 +--
 .../ranger/plugin/policyengine/PolicyEngine.java   |  12 +--
 .../policyengine/RangerPolicyRepository.java       |  66 ++++++-------
 .../ranger/plugin/util/RangerResourceTrie.java     | 103 ++++++++-------------
 5 files changed, 106 insertions(+), 123 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 6963995..75b0bf4 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
@@ -710,23 +710,24 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
                if(LOG.isDebugEnabled()) {
                        LOG.debug("==> RangerTagEnricher.getEvaluators(" + 
(resource != null ? resource.getAsString() : null) + ")");
                }
-
-               List<RangerServiceResourceMatcher> ret = null;
+               List<RangerServiceResourceMatcher>  ret        = 
Collections.EMPTY_LIST;
 
                final Map<String, 
RangerResourceTrie<RangerServiceResourceMatcher>> serviceResourceTrie = 
enrichedServiceTags.getServiceResourceTrie();
 
                if (resource == null || resource.getKeys() == null || 
resource.getKeys().isEmpty() || serviceResourceTrie == null) {
                        ret = enrichedServiceTags.getServiceResourceMatchers();
                } else {
+                       Set<RangerServiceResourceMatcher> evaluators = null;
+
                        RangerPerfTracer perf = null;
 
-                       
if(RangerPerfTracer.isPerfTraceEnabled(PERF_TRIE_OP_LOG)) {
+                       if 
(RangerPerfTracer.isPerfTraceEnabled(PERF_TRIE_OP_LOG)) {
                                perf = 
RangerPerfTracer.getPerfTracer(PERF_TRIE_OP_LOG, 
"RangerTagEnricher.getEvaluators(resource=" + resource.getAsString() + ")");
                        }
 
-                       Set<String> resourceKeys = resource.getKeys();
-                       List<List<RangerServiceResourceMatcher>> 
serviceResourceMatchersList = null;
-                       List<RangerServiceResourceMatcher> smallestList = null;
+                       Set<String>                             resourceKeys = 
resource.getKeys();
+                       List<Set<RangerServiceResourceMatcher>> 
serviceResourceMatchersList = null;
+                       Set<RangerServiceResourceMatcher>       smallestList = 
null;
 
                        if (CollectionUtils.isNotEmpty(resourceKeys)) {
 
@@ -737,7 +738,7 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
                                                continue;
                                        }
 
-                                       List<RangerServiceResourceMatcher> 
serviceResourceMatchers = 
trie.getEvaluatorsForResource(resource.getValue(resourceName));
+                                       Set<RangerServiceResourceMatcher> 
serviceResourceMatchers = 
trie.getEvaluatorsForResource(resource.getValue(resourceName));
 
                                        if 
(CollectionUtils.isEmpty(serviceResourceMatchers)) { // no tags for this 
resource, bail out
                                                serviceResourceMatchersList = 
null;
@@ -760,26 +761,27 @@ public class RangerTagEnricher extends 
RangerAbstractContextEnricher {
                                        }
                                }
                                if (serviceResourceMatchersList != null) {
-                                       ret = new ArrayList<>(smallestList);
-                                       for (List<RangerServiceResourceMatcher> 
serviceResourceMatchers : serviceResourceMatchersList) {
+                                       evaluators = new 
HashSet<>(smallestList);
+                                       for (Set<RangerServiceResourceMatcher> 
serviceResourceMatchers : serviceResourceMatchersList) {
                                                if (serviceResourceMatchers != 
smallestList) {
                                                        // remove other 
serviceResourceMatchers from ret that are not in serviceResourceMatchers
-                                                       
ret.retainAll(serviceResourceMatchers);
-                                                       if 
(CollectionUtils.isEmpty(ret)) { // if no policy exists, bail out and return 
empty list
-                                                               ret = null;
+                                                       
evaluators.retainAll(serviceResourceMatchers);
+                                                       if 
(CollectionUtils.isEmpty(evaluators)) { // if no policy exists, bail out and 
return empty list
+                                                               evaluators = 
null;
                                                                break;
                                                        }
                                                }
                                        }
                                } else {
-                                       ret = smallestList;
+                                       evaluators = smallestList;
                                }
                        }
-                       RangerPerfTracer.logAlways(perf);
-               }
 
-               if(ret == null) {
-                       ret = Collections.emptyList();
+                       if (evaluators != null) {
+                               ret = new ArrayList<>(evaluators);
+                       }
+
+                       RangerPerfTracer.logAlways(perf);
                }
 
                if(LOG.isDebugEnabled()) {
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 35e3ebb..d892676 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
@@ -411,15 +411,15 @@ public class RangerSecurityZoneValidator extends 
RangerValidator {
 
             for (Map<String, List<String>> resource : resources) {
 
-                List<List<RangerZoneResourceMatcher>> zoneMatchersList = null;
-                List<RangerZoneResourceMatcher>       smallestList     = null;
+                List<Set<RangerZoneResourceMatcher>> zoneMatchersList = null;
+                Set<RangerZoneResourceMatcher>       smallestList     = null;
 
                 for (Map.Entry<String, List<String>> entry : 
resource.entrySet()) {
                     String       resourceDefName = entry.getKey();
                     List<String> resourceValues  = entry.getValue();
 
                     RangerResourceTrie<RangerZoneResourceMatcher> trie         
= trieMap.get(resourceDefName);
-                    List<RangerZoneResourceMatcher>               matchedZones 
= trie.getEvaluatorsForResource(resourceValues);
+                    Set<RangerZoneResourceMatcher>               matchedZones 
= trie.getEvaluatorsForResource(resourceValues);
 
                     if (LOG.isDebugEnabled()) {
                         LOG.debug("ResourceDefName:[" + resourceDefName +"], 
values:[" + resourceValues +"], matched-zones:[" + matchedZones +"]");
@@ -447,11 +447,11 @@ public class RangerSecurityZoneValidator extends 
RangerValidator {
                 if (smallestList == null) {
                     continue;
                 }
-                final List<RangerZoneResourceMatcher> intersection;
+                final Set<RangerZoneResourceMatcher> intersection;
 
                 if (zoneMatchersList != null) {
-                    intersection = new ArrayList<>(smallestList);
-                    for (List<RangerZoneResourceMatcher> zoneMatchers : 
zoneMatchersList) {
+                    intersection = new HashSet<>(smallestList);
+                    for (Set<RangerZoneResourceMatcher> zoneMatchers : 
zoneMatchersList) {
                         if (zoneMatchers != smallestList) {
                             // remove zones from intersection that are not in 
zoneMatchers
                             intersection.retainAll(zoneMatchers);
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 f7ca5e8..38b1c93 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
@@ -484,8 +484,8 @@ public class PolicyEngine {
         String ret = null;
 
         if (MapUtils.isNotEmpty(this.resourceZoneTrie)) {
-            List<List<RangerZoneResourceMatcher>> zoneMatchersList = null;
-            List<RangerZoneResourceMatcher>       smallestList     = null;
+            List<Set<RangerZoneResourceMatcher>> zoneMatchersList = null;
+            Set<RangerZoneResourceMatcher>       smallestList     = null;
 
             for (Map.Entry<String, ?> entry : resource.entrySet()) {
                 String                                        resourceDefName 
= entry.getKey();
@@ -496,7 +496,7 @@ public class PolicyEngine {
                     continue;
                 }
 
-                List<RangerZoneResourceMatcher> matchedZones = 
trie.getEvaluatorsForResource(resourceValues);
+                Set<RangerZoneResourceMatcher> matchedZones = 
trie.getEvaluatorsForResource(resourceValues);
 
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("ResourceDefName:[" + resourceDefName + "], 
values:[" + resourceValues + "], matched-zones:[" + matchedZones + "]");
@@ -526,12 +526,12 @@ public class PolicyEngine {
                 }
             }
             if (smallestList != null) {
-                final List<RangerZoneResourceMatcher> intersection;
+                final Set<RangerZoneResourceMatcher> intersection;
 
                 if (zoneMatchersList != null) {
-                    intersection = new ArrayList<>(smallestList);
+                    intersection = new HashSet<>(smallestList);
 
-                    for (List<RangerZoneResourceMatcher> zoneMatchers : 
zoneMatchersList) {
+                    for (Set<RangerZoneResourceMatcher> zoneMatchers : 
zoneMatchersList) {
                         if (zoneMatchers != smallestList) {
                             // remove zones from intersection that are not in 
zoneMatchers
                             intersection.retainAll(zoneMatchers);
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java
index e583fa1..3a78eab 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/policyengine/RangerPolicyRepository.java
@@ -47,6 +47,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -721,8 +722,7 @@ public class RangerPolicyRepository {
     }
 
     private List<RangerPolicyEvaluator> 
getLikelyMatchPolicyEvaluators(Map<String, RangerResourceTrie> resourceTrie, 
RangerAccessResource resource) {
-        List<RangerPolicyEvaluator> ret          = null;
-        Set<String>                 resourceKeys = resource == null ? null : 
resource.getKeys();
+        List<RangerPolicyEvaluator> ret          = Collections.EMPTY_LIST;
 
         RangerPerfTracer perf = null;
 
@@ -730,60 +730,64 @@ public class RangerPolicyRepository {
             perf = RangerPerfTracer.getPerfTracer(PERF_TRIE_OP_LOG, 
"RangerPolicyRepository.getLikelyMatchEvaluators(resource=" + 
resource.getAsString() + ")");
         }
 
+        Set<String>                 resourceKeys = resource == null ? null : 
resource.getKeys();
+
         if(CollectionUtils.isNotEmpty(resourceKeys)) {
-            List<List<RangerPolicyEvaluator>> resourceEvaluatorsList = null;
-            List<RangerPolicyEvaluator> smallestList = null;
+            Set<RangerPolicyEvaluator>       evaluators = null;
+            List<Set<RangerPolicyEvaluator>> resourceEvaluatorsSet = null;
+            Set<RangerPolicyEvaluator>       smallestSet = null;
 
-            for(String resourceName : resourceKeys) {
+            for (String resourceName : resourceKeys) {
                 RangerResourceTrie trie = resourceTrie.get(resourceName);
 
-                if(trie == null) { // if no trie exists for this resource 
level, ignore and continue to next level
+                if (trie == null) { // if no trie exists for this resource 
level, ignore and continue to next level
                     continue;
                 }
 
-                List<RangerPolicyEvaluator> resourceEvaluators = 
trie.getEvaluatorsForResource(resource.getValue(resourceName));
+                Set<RangerPolicyEvaluator> resourceEvaluators = 
trie.getEvaluatorsForResource(resource.getValue(resourceName));
 
-                if(CollectionUtils.isEmpty(resourceEvaluators)) { // no 
policies for this resource, bail out
-                    resourceEvaluatorsList = null;
-                    smallestList = null;
+                if (CollectionUtils.isEmpty(resourceEvaluators)) { // no 
policies for this resource, bail out
+                    resourceEvaluatorsSet = null;
+                    smallestSet = null;
                     break;
                 }
 
-                if (smallestList == null) {
-                    smallestList = resourceEvaluators;
+                if (smallestSet == null) {
+                    smallestSet = resourceEvaluators;
                 } else {
-                    if (resourceEvaluatorsList == null) {
-                        resourceEvaluatorsList = new ArrayList<>();
-                        resourceEvaluatorsList.add(smallestList);
+                    if (resourceEvaluatorsSet == null) {
+                        resourceEvaluatorsSet = new ArrayList<>();
+                        resourceEvaluatorsSet.add(smallestSet);
                     }
-                    resourceEvaluatorsList.add(resourceEvaluators);
+                    resourceEvaluatorsSet.add(resourceEvaluators);
 
-                    if (smallestList.size() > resourceEvaluators.size()) {
-                        smallestList = resourceEvaluators;
+                    if (smallestSet.size() > resourceEvaluators.size()) {
+                        smallestSet = resourceEvaluators;
                     }
                 }
             }
 
-            if (resourceEvaluatorsList != null) {
-                ret = new ArrayList<>(smallestList);
-                for (List<RangerPolicyEvaluator> resourceEvaluators : 
resourceEvaluatorsList) {
-                    if (resourceEvaluators != smallestList) {
+            if (resourceEvaluatorsSet != null) {
+                evaluators = new HashSet<>(smallestSet);
+                for (Set<RangerPolicyEvaluator> resourceEvaluators : 
resourceEvaluatorsSet) {
+                    if (resourceEvaluators != smallestSet) {
                         // remove policies from ret that are not in 
resourceEvaluators
-                        ret.retainAll(resourceEvaluators);
+                        evaluators.retainAll(resourceEvaluators);
 
-                        if (CollectionUtils.isEmpty(ret)) { // if no policy 
exists, bail out and return empty list
-                            ret = null;
+                        if (CollectionUtils.isEmpty(evaluators)) { // if no 
policy exists, bail out and return empty list
+                            evaluators = null;
                             break;
                         }
                     }
                 }
             } else {
-                ret = smallestList;
+                evaluators = smallestSet;
             }
-        }
 
-        if(ret == null) {
-            ret = Collections.emptyList();
+            if (evaluators != null) {
+                ret = new ArrayList<>(evaluators);
+                ret.sort(RangerPolicyEvaluator.EVAL_ORDER_COMPARATOR);
+            }
         }
 
         RangerPerfTracer.logAlways(perf);
@@ -1189,7 +1193,7 @@ public class RangerPolicyRepository {
             ret = new HashMap<>();
 
             for (RangerServiceDef.RangerResourceDef resourceDef : 
serviceDef.getResources()) {
-                ret.put(resourceDef.getName(), new 
RangerResourceTrie(resourceDef, evaluators, 
RangerPolicyEvaluator.EVAL_ORDER_COMPARATOR, optimizeTrieForRetrieval, 
pluginContext));
+                ret.put(resourceDef.getName(), new 
RangerResourceTrie(resourceDef, evaluators, optimizeTrieForRetrieval, 
pluginContext));
             }
         } else {
             ret = null;
@@ -1212,7 +1216,7 @@ public class RangerPolicyRepository {
                 if (RangerPolicyDelta.CHANGE_TYPE_POLICY_DELETE == 
policyDeltaType || RangerPolicyDelta.CHANGE_TYPE_POLICY_UPDATE == 
policyDeltaType) {
                     LOG.warn("policyDeltaType is not for POLICY_CREATE and 
trie for resourceDef:[" + resourceDefName + "] was null! Should not have 
happened!!");
                 }
-                trie = new RangerResourceTrie<>(resourceDef, new 
ArrayList<>(), RangerPolicyEvaluator.EVAL_ORDER_COMPARATOR, true, 
pluginContext);
+                trie = new RangerResourceTrie<>(resourceDef, new 
ArrayList<>(), true, pluginContext);
                 trieMap.put(resourceDefName, trie);
             }
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
index cdf9f70..ea92e3c 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
@@ -34,10 +34,11 @@ import 
org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -55,14 +56,13 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
     private final boolean optWildcard;
     private final String wildcardChars;
     private final TrieNode<T> root;
-    private final Comparator<T> comparator;
     private final boolean isOptimizedForRetrieval;
 
     public RangerResourceTrie(RangerServiceDef.RangerResourceDef resourceDef, 
List<T> evaluators) {
-        this(resourceDef, evaluators, null, true, null);
+        this(resourceDef, evaluators, true, null);
     }
 
-    public RangerResourceTrie(RangerServiceDef.RangerResourceDef resourceDef, 
List<T> evaluators, Comparator<T> comparator, boolean isOptimizedForRetrieval, 
RangerPluginContext pluginContext) {
+    public RangerResourceTrie(RangerServiceDef.RangerResourceDef resourceDef, 
List<T> evaluators, boolean isOptimizedForRetrieval, RangerPluginContext 
pluginContext) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> RangerResourceTrie(" + resourceDef.getName() + ", 
evaluatorCount=" + evaluators.size() + ", isOptimizedForRetrieval=" + 
isOptimizedForRetrieval + ")");
         }
@@ -104,7 +104,6 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         this.optIgnoreCase = 
RangerAbstractResourceMatcher.getOptionIgnoreCase(matcherOptions);
         this.optWildcard   = 
RangerAbstractResourceMatcher.getOptionWildCard(matcherOptions);
         this.wildcardChars = optWildcard ? DEFAULT_WILDCARD_CHARS + 
tokenReplaceSpecialChars : "" + tokenReplaceSpecialChars;
-        this.comparator    = comparator;
         this.isOptimizedForRetrieval = isOptimizedForRetrieval;
 
         TrieNode<T> tmpRoot = buildTrie(resourceDef, evaluators, 
builderThreadCount);
@@ -138,7 +137,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         return resourceDef.getName();
     }
 
-    public List<T> getEvaluatorsForResource(Object resource) {
+    public Set<T> getEvaluatorsForResource(Object resource) {
         if (resource instanceof String) {
             return getEvaluatorsForResource((String) resource);
         } else if (resource instanceof Collection) {
@@ -173,8 +172,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             } else {
                 if (CollectionUtils.isNotEmpty(resource.getValues())) {
                     for (String value : resource.getValues()) {
-                        TrieNode<T> node = insert(root, value, 
resource.getIsRecursive(), evaluator);
-                        node.sortEvaluators(comparator);
+                        insert(root, value, resource.getIsRecursive(), 
evaluator);
                     }
                 }
             }
@@ -219,7 +217,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
 
     public void wrapUpUpdate() {
         if (root != null) {
-            root.wrapUpUpdate(comparator);
+            root.wrapUpUpdate();
         }
     }
 
@@ -271,7 +269,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         return ret;
     }
 
-    private boolean compareLists(List<? extends RangerPolicyResourceEvaluator> 
me, List<? extends RangerPolicyResourceEvaluator> other) {
+    private boolean compareLists(Set<? extends RangerPolicyResourceEvaluator> 
me, Set<? extends RangerPolicyResourceEvaluator> other) {
         boolean ret;
 
         if (me == null || other == null) {
@@ -280,12 +278,15 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             ret = me.size() == other.size();
 
             if (ret) {
+                       List<? extends RangerPolicyResourceEvaluator> meAsList 
= new ArrayList<>(me);
+                       List<? extends RangerPolicyResourceEvaluator> 
otherAsList = new ArrayList<>(other);
+
                 List<Long> myIds = new ArrayList<>();
                 List<Long> otherIds = new ArrayList<>();
-                for (RangerPolicyResourceEvaluator evaluator : me) {
+                for (RangerPolicyResourceEvaluator evaluator : meAsList) {
                     myIds.add(evaluator.getId());
                 }
-                for (RangerPolicyResourceEvaluator evaluator : other) {
+                for (RangerPolicyResourceEvaluator evaluator : otherAsList) {
                     otherIds.add(evaluator.getId());
                 }
 
@@ -320,7 +321,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
                 }
             } else {
                 if (source.wildcardEvaluators != null) {
-                    dest.wildcardEvaluators = new 
ArrayList<>(source.wildcardEvaluators);
+                    dest.wildcardEvaluators = new 
HashSet<>(source.wildcardEvaluators);
                 } else {
                     dest.wildcardEvaluators = null;
                 }
@@ -329,7 +330,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
                 if (source.evaluators == source.wildcardEvaluators) {
                     dest.evaluators = dest.wildcardEvaluators;
                 } else {
-                    dest.evaluators = new ArrayList<>(source.evaluators);
+                    dest.evaluators = new HashSet<>(source.evaluators);
                 }
             } else {
                 dest.evaluators = null;
@@ -362,7 +363,6 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         this.optIgnoreCase = other.optIgnoreCase;
         this.optWildcard = other.optWildcard;
         this.wildcardChars = other.wildcardChars;
-        this.comparator = other.comparator;
         this.isOptimizedForRetrieval = false;
         this.root = copyTrieSubtree(other.root, null);
 
@@ -543,7 +543,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         return ret;
     }
 
-    private TrieNode<T> insert(TrieNode<T> currentRoot, String resource, 
boolean isRecursive, T evaluator) {
+    private void insert(TrieNode<T> currentRoot, String resource, boolean 
isRecursive, T evaluator) {
 
         TrieNode<T>   curr       = currentRoot;
         final String  prefix     = getNonWildcardPrefix(resource);
@@ -559,7 +559,6 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             curr.addEvaluator(evaluator);
         }
 
-        return curr;
     }
 
     private String getNonWildcardPrefix(String str) {
@@ -577,7 +576,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         return str.substring(0, minIndex);
     }
 
-    private List<T> getEvaluatorsForResource(String resource) {
+    private Set<T> getEvaluatorsForResource(String resource) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> RangerResourceTrie.getEvaluatorsForResource(" + 
resource + ")");
         }
@@ -595,7 +594,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
 
         while (i < len) {
             if (!isOptimizedForRetrieval) {
-                curr.setupIfNeeded(parent, comparator);
+                curr.setupIfNeeded(parent);
             }
 
             final TrieNode<T> child = curr.getChild(getLookupChar(resource, 
i));
@@ -616,10 +615,10 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         }
 
         if (!isOptimizedForRetrieval) {
-            curr.setupIfNeeded(parent, comparator);
+            curr.setupIfNeeded(parent);
         }
 
-        List<T> ret = i == len ? curr.getEvaluators() : 
curr.getWildcardEvaluators();
+        Set<T> ret = i == len ? curr.getEvaluators() : 
curr.getWildcardEvaluators();
 
         RangerPerfTracer.logAlways(perf);
 
@@ -672,16 +671,16 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         return curr;
     }
 
-    private List<T> getEvaluatorsForResources(Collection<String> resources) {
+    private Set<T> getEvaluatorsForResources(Collection<String> resources) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> RangerResourceTrie.getEvaluatorsForResources(" + 
resources + ")");
         }
 
-        List<T>      ret           = null;
+        Set<T>      ret           = null;
         Map<Long, T> evaluatorsMap = null;
 
         for (String resource : resources) {
-            List<T> resourceEvaluators = getEvaluatorsForResource(resource);
+            Set<T> resourceEvaluators = getEvaluatorsForResource(resource);
 
             if (CollectionUtils.isEmpty(resourceEvaluators)) {
                 continue;
@@ -709,11 +708,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         }
 
         if (ret == null && evaluatorsMap != null) {
-            ret = new ArrayList<>(evaluatorsMap.values());
-
-            if (comparator != null) {
-                ret.sort(comparator);
-            }
+            ret = new HashSet<>(evaluatorsMap.values());
         }
 
         if(LOG.isDebugEnabled()) {
@@ -826,8 +821,8 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
         private          String                      str;
         private          TrieNode<U>                 parent;
         private final    Map<Character, TrieNode<U>> children = new 
HashMap<>();
-        private          List<U>                     evaluators;
-        private          List<U>                     wildcardEvaluators;
+        private          Set<U>                      evaluators;
+        private          Set<U>                      wildcardEvaluators;
         private          boolean                     
isSharingParentWildcardEvaluators;
         private volatile boolean                     isSetup = false;
 
@@ -855,11 +850,11 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             return children;
         }
 
-        List<U> getEvaluators() {
+        Set<U> getEvaluators() {
             return evaluators;
         }
 
-        List<U> getWildcardEvaluators() {
+        Set<U> getWildcardEvaluators() {
             return wildcardEvaluators;
         }
 
@@ -974,17 +969,14 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
 
         void addEvaluator(U evaluator) {
             if (evaluators == null) {
-                evaluators = new ArrayList<>();
-            }
-
-            if (!evaluators.contains(evaluator)) {
-                evaluators.add(evaluator);
+                evaluators = new HashSet<>();
             }
+            evaluators.add(evaluator);
         }
 
         void addWildcardEvaluator(U evaluator) {
             if (wildcardEvaluators == null) {
-                wildcardEvaluators = new ArrayList<>();
+                wildcardEvaluators = new HashSet<>();
             }
 
             if (!wildcardEvaluators.contains(evaluator)) {
@@ -1036,7 +1028,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
                             if (isSharingParentWildcardEvaluators) {
                                 wildcardEvaluators = null;
                             } else {
-                                List<U> parentWildcardEvaluators = getParent() 
== null ? null : getParent().getWildcardEvaluators();
+                                Set<U> parentWildcardEvaluators = getParent() 
== null ? null : getParent().getWildcardEvaluators();
 
                                 if (parentWildcardEvaluators != null) {
                                     
wildcardEvaluators.removeAll(parentWildcardEvaluators);
@@ -1054,7 +1046,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             }
         }
 
-        void wrapUpUpdate(Comparator<U> comparator) {
+        void wrapUpUpdate() {
             if (isOptimizedForRetrieval) {
                 RangerPerfTracer postSetupPerf = null;
 
@@ -1062,25 +1054,25 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
                     postSetupPerf = 
RangerPerfTracer.getPerfTracer(PERF_TRIE_INIT_LOG, 
"RangerResourceTrie.init(name=" + resourceDef.getName() + "-postSetup)");
                 }
 
-                postSetup(null, comparator);
+                postSetup(null);
 
                 RangerPerfTracer.logAlways(postSetupPerf);
             }
         }
 
-        void postSetup(List<U> parentWildcardEvaluators, Comparator<U> 
comparator) {
+        void postSetup(Set<U> parentWildcardEvaluators) {
 
-            setup(parentWildcardEvaluators, comparator);
+            setup(parentWildcardEvaluators);
 
             for (Map.Entry<Character, TrieNode<U>> entry : 
children.entrySet()) {
                 TrieNode<U> child = entry.getValue();
 
-                child.postSetup(wildcardEvaluators, comparator);
+                child.postSetup(wildcardEvaluators);
             }
 
         }
 
-        void setupIfNeeded(TrieNode<U> parent, Comparator<U> comparator) {
+        void setupIfNeeded(TrieNode<U> parent) {
 
             boolean setupNeeded = !isSetup;
 
@@ -1089,7 +1081,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
                     setupNeeded = !isSetup;
 
                     if (setupNeeded) {
-                        setup(parent == null ? null : 
parent.getWildcardEvaluators(), comparator);
+                        setup(parent == null ? null : 
parent.getWildcardEvaluators());
                         if (TRACE_LOG.isTraceEnabled()) {
                             StringBuilder sb = new StringBuilder();
                             this.toString(sb);
@@ -1100,7 +1092,7 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
             }
         }
 
-        void setup(List<U> parentWildcardEvaluators, Comparator<U> comparator) 
{
+        void setup(Set<U> parentWildcardEvaluators) {
             if (!isSetup) {
                 // finalize wildcard-evaluators list by including parent's 
wildcard evaluators
                 if (parentWildcardEvaluators != null) {
@@ -1126,9 +1118,6 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
                 }
 
                 isSetup = true;
-
-                sortEvaluators(comparator);
-
             }
         }
 
@@ -1143,18 +1132,6 @@ public class RangerResourceTrie<T extends 
RangerPolicyResourceEvaluator> {
 
         }
 
-        private void sortEvaluators(Comparator<U> comparator) {
-            if (isSetup && comparator != null) {
-                if (!isSharingParentWildcardEvaluators && 
CollectionUtils.isNotEmpty(wildcardEvaluators)) {
-                    wildcardEvaluators.sort(comparator);
-                }
-
-                if (evaluators != wildcardEvaluators && 
CollectionUtils.isNotEmpty(evaluators)) {
-                    evaluators.sort(comparator);
-                }
-            }
-        }
-
         public void toString(StringBuilder sb) {
             String nodeValue = this.str;
 

Reply via email to