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;