You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ab...@apache.org on 2018/09/27 03:37:14 UTC

[1/2] ranger git commit: RANGER-2173: Optimize Trie constuction and Policy lookup

Repository: ranger
Updated Branches:
  refs/heads/ranger-0.7 dddcf0155 -> 4bdfbd68e


RANGER-2173: Optimize Trie constuction and Policy lookup


Project: http://git-wip-us.apache.org/repos/asf/ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/ranger/commit/6a6e955b
Tree: http://git-wip-us.apache.org/repos/asf/ranger/tree/6a6e955b
Diff: http://git-wip-us.apache.org/repos/asf/ranger/diff/6a6e955b

Branch: refs/heads/ranger-0.7
Commit: 6a6e955b3af41253b1a949e42f202e90875a4d06
Parents: dddcf01
Author: Abhay Kulkarni <ak...@hortonworks.com>
Authored: Tue Jul 31 16:30:47 2018 -0700
Committer: Abhay Kulkarni <ak...@hortonworks.com>
Committed: Wed Sep 26 20:20:48 2018 -0700

----------------------------------------------------------------------
 .../ranger/plugin/util/RangerResourceTrie.java  | 539 ++++++++++++-------
 agents-common/src/test/resources/log4j.xml      |  14 +
 2 files changed, 348 insertions(+), 205 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ranger/blob/6a6e955b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
----------------------------------------------------------------------
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 189a72b..a255566 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
@@ -21,6 +21,7 @@ package org.apache.ranger.plugin.util;
 
 
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
@@ -30,7 +31,7 @@ import org.apache.ranger.plugin.resourcematcher.RangerAbstractResourceMatcher;
 import org.apache.ranger.plugin.resourcematcher.RangerResourceMatcher;
 
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
@@ -38,14 +39,17 @@ import java.util.Map;
 
 public class RangerResourceTrie<T extends RangerPolicyResourceEvaluator> {
     private static final Log LOG = LogFactory.getLog(RangerResourceTrie.class);
+    private static final Log PERF_TRIE_INIT_LOG = RangerPerfTracer.getPerfLogger("resourcetrie.init");
+    private static final Log PERF_TRIE_OP_LOG = RangerPerfTracer.getPerfLogger("resourcetrie.op");
 
     private static final String DEFAULT_WILDCARD_CHARS = "*?";
 
-    private final String   resourceName;
-    private final boolean  optIgnoreCase;
-    private final boolean  optWildcard;
-    private final String   wildcardChars;
-    private final TrieNode root;
+    private final String        resourceName;
+    private final boolean       optIgnoreCase;
+    private final boolean       optWildcard;
+    private final String        wildcardChars;
+    private final TrieNode<T>   root;
+    private final Comparator<T> comparator;
 
     public RangerResourceTrie(RangerServiceDef.RangerResourceDef resourceDef, List<T> evaluators) {
         this(resourceDef, evaluators, null);
@@ -56,6 +60,12 @@ public class RangerResourceTrie<T extends RangerPolicyResourceEvaluator> {
             LOG.debug("==> RangerResourceTrie(" + resourceDef.getName() + ", evaluatorCount=" + evaluators.size() + ")");
         }
 
+        RangerPerfTracer perf = null;
+
+        if(RangerPerfTracer.isPerfTraceEnabled(PERF_TRIE_INIT_LOG)) {
+            perf = RangerPerfTracer.getPerfTracer(PERF_TRIE_INIT_LOG, "RangerResourceTrie(name=" + resourceDef.getName() + ")");
+        }
+
         Map<String, String> matcherOptions = resourceDef.getMatcherOptions();
 
         boolean optReplaceTokens = RangerAbstractResourceMatcher.getOptionReplaceTokens(matcherOptions);
@@ -76,7 +86,8 @@ 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.root          = new TrieNode(Character.valueOf((char)0));
+        this.root          = new TrieNode<>(null);
+        this.comparator    = comparator;
 
         for(T evaluator : evaluators) {
             Map<String, RangerPolicyResource> policyResources = evaluator.getPolicyResource();
@@ -109,7 +120,15 @@ public class RangerResourceTrie<T extends RangerPolicyResourceEvaluator> {
 
         root.postSetup(null, comparator);
 
-        LOG.info(toString());
+        RangerPerfTracer.logAlways(perf);
+
+        if (PERF_TRIE_INIT_LOG.isTraceEnabled()) {
+            PERF_TRIE_INIT_LOG.trace(toString());
+
+            StringBuilder sb = new StringBuilder();
+            root.toString("", sb);
+            PERF_TRIE_INIT_LOG.trace("Trie Dump:\n{" + sb.toString() + "}");
+        }
 
         if(LOG.isDebugEnabled()) {
             LOG.debug("<== RangerResourceTrie(" + resourceDef.getName() + ", evaluatorCount=" + evaluators.size() + "): " + toString());
@@ -120,35 +139,102 @@ public class RangerResourceTrie<T extends RangerPolicyResourceEvaluator> {
         return resourceName;
     }
 
+    private TrieData getTrieData() {
+        TrieData ret = new TrieData();
+
+        root.populateTrieData(ret);
+        ret.maxDepth = getMaxDepth();
+
+        return ret;
+    }
+
+    private int getMaxDepth() {
+        return root.getMaxDepth();
+    }
+
+    private Character getLookupChar(char ch) {
+        return optIgnoreCase ? Character.toLowerCase(ch) : ch;
+    }
+
+    private Character getLookupChar(String str, int index) {
+        return getLookupChar(str.charAt(index));
+    }
+
+    private void insert(String resource, boolean isRecursive, T evaluator) {
+
+        RangerPerfTracer perf = null;
+
+        if(RangerPerfTracer.isPerfTraceEnabled(PERF_TRIE_INIT_LOG)) {
+            perf = RangerPerfTracer.getPerfTracer(PERF_TRIE_INIT_LOG, "RangerResourceTrie.insert(resource=" + resource + ")");
+        }
+
+        TrieNode<T> curr       = root;
+
+        final String prefix       = getNonWildcardPrefix(resource);
+        final boolean isWildcard  = prefix.length() != resource.length();
+
+        if (StringUtils.isNotEmpty(prefix)) {
+            curr = curr.getOrCreateChild(prefix);
+        }
+
+        if(isWildcard || isRecursive) {
+            curr.addWildcardEvaluator(evaluator);
+        } else {
+            curr.addEvaluator(evaluator);
+        }
+
+        RangerPerfTracer.logAlways(perf);
+    }
+
+    private String getNonWildcardPrefix(String str) {
+        if (!optWildcard) return str;
+        int minIndex = str.length();
+        for (int i = 0; i < wildcardChars.length(); i++) {
+            int index = str.indexOf(wildcardChars.charAt(i));
+            if (index != -1 && index < minIndex) {
+                minIndex = index;
+            }
+        }
+        return str.substring(0, minIndex);
+    }
+
     public List<T> getEvaluatorsForResource(String resource) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("==> RangerResourceTrie.getEvaluatorsForResource(" + resource + ")");
         }
 
-        List<T> ret = null;
+        RangerPerfTracer perf = null;
+
+        if(RangerPerfTracer.isPerfTraceEnabled(PERF_TRIE_OP_LOG)) {
+            perf = RangerPerfTracer.getPerfTracer(PERF_TRIE_OP_LOG, "RangerResourceTrie.getEvaluatorsForResource(resource=" + resource + ")");
+        }
+
+        TrieNode<T> curr = root;
 
-        TrieNode curr = root;
+        final int   len  = resource.length();
+        int         i    = 0;
 
-        final int len = resource.length();
-        for(int i = 0; i < len; i++) {
-            Character ch    = getLookupChar(resource.charAt(i));
-            TrieNode  child = curr.getChild(ch);
+        while (i < len) {
+            final TrieNode<T> child = curr.getChild(getLookupChar(resource, i));
 
-            if(child == null) {
-                ret = curr.getWildcardEvaluators();
-                curr = null; // so that curr.getEvaluators() will not be called below
+            if (child == null) {
                 break;
             }
 
-            curr = child;
-        }
+            final String childStr = child.getStr();
 
-        if(ret == null) {
-            if(curr != null) {
-                ret = curr.getEvaluators();
+            if (!resource.regionMatches(optIgnoreCase, i, childStr, 0, childStr.length())) {
+                break;
             }
+
+            curr = child;
+            i += childStr.length();
         }
 
+        List<T> ret = i == len ? curr.getEvaluators() : curr.getWildcardEvaluators();
+
+        RangerPerfTracer.logAlways(perf);
+
         if(LOG.isDebugEnabled()) {
             LOG.debug("<== RangerResourceTrie.getEvaluatorsForResource(" + resource + "): evaluatorCount=" + (ret == null ? 0 : ret.size()));
         }
@@ -156,50 +242,55 @@ public class RangerResourceTrie<T extends RangerPolicyResourceEvaluator> {
         return ret;
     }
 
-    public TrieData getTrieData() {
-        TrieData ret = new TrieData();
-
-        root.populateTrieData(ret);
-        ret.maxDepth = getMaxDepth();
+    private List<T> getEvaluatorsForResources(Collection<String> resources) {
+        if(LOG.isDebugEnabled()) {
+            LOG.debug("==> RangerResourceTrie.getEvaluatorsForResources(" + resources + ")");
+        }
 
-        return ret;
-    }
+        List<T>      ret           = null;
+        Map<Long, T> evaluatorsMap = null;
 
-    public int getMaxDepth() {
-        return root.getMaxDepth();
-    }
+        for (String resource : resources) {
+            List<T> resourceEvaluators = getEvaluatorsForResource(resource);
 
-    private final Character getLookupChar(char ch) {
-        if(optIgnoreCase) {
-            ch = Character.toLowerCase(ch);
-        }
+            if (CollectionUtils.isEmpty(resourceEvaluators)) {
+                continue;
+            }
 
-        return Character.valueOf(ch);
-    }
+            if (evaluatorsMap == null) {
+                if (ret == null) { // first resource: don't create map yet
+                    ret = resourceEvaluators;
+                } else if (ret != resourceEvaluators) { // if evaluator list is same as earlier resources, retain the list, else create a map
+                    evaluatorsMap = new HashMap<>();
 
-    private void insert(String resource, boolean isRecursive, T evaluator) {
-        TrieNode curr       = root;
-        boolean  isWildcard = false;
+                    for (T evaluator : ret) {
+                        evaluatorsMap.put(evaluator.getId(), evaluator);
+                    }
 
-        final int len = resource.length();
-        for(int i = 0; i < len; i++) {
-            Character ch = getLookupChar(resource.charAt(i));
+                    ret = null;
+                }
+            }
 
-            if(optWildcard) {
-                if (wildcardChars.indexOf(ch) != -1) {
-                    isWildcard = true;
-                    break;
+            if (evaluatorsMap != null) {
+                for (T evaluator : resourceEvaluators) {
+                    evaluatorsMap.put(evaluator.getId(), evaluator);
                 }
             }
+        }
 
-            curr = curr.getOrCreateChild(ch);
+        if (ret == null && evaluatorsMap != null) {
+            ret = new ArrayList<>(evaluatorsMap.values());
+
+            if (comparator != null) {
+                ret.sort(comparator);
+            }
         }
 
-        if(isWildcard || isRecursive) {
-            curr.addWildcardEvaluator(evaluator);
-        } else {
-            curr.addEvaluator(evaluator);
+        if(LOG.isDebugEnabled()) {
+            LOG.debug("<== RangerResourceTrie.getEvaluatorsForResources(" + resources + "): evaluatorCount=" + (ret == null ? 0 : ret.size()));
         }
+
+        return ret;
     }
 
     @Override
@@ -224,219 +315,257 @@ public class RangerResourceTrie<T extends RangerPolicyResourceEvaluator> {
         return sb.toString();
     }
 
-    public class TrieData {
-        int nodeCount                     = 0;
-        int leafNodeCount                 = 0;
-        int singleChildNodeCount          = 0;
-        int maxDepth                      = 0;
-        int evaluatorListCount            = 0;
-        int wildcardEvaluatorListCount    = 0;
-        int evaluatorListRefCount         = 0;
-        int wildcardEvaluatorListRefCount = 0;
+    class TrieData {
+        int nodeCount;
+        int leafNodeCount;
+        int singleChildNodeCount;
+        int maxDepth;
+        int evaluatorListCount;
+        int wildcardEvaluatorListCount;
+        int evaluatorListRefCount;
+        int wildcardEvaluatorListRefCount;
     }
-}
 
-class TrieNode<T extends RangerPolicyResourceEvaluator> {
-    private final Character          c;
-    private Map<Character, TrieNode> children           = null;
-    private List<T>                  evaluators         = null;
-    private List<T>                  wildcardEvaluators = null;
-    private boolean   isSharingParentWildcardEvaluators = false;
+    class TrieNode<U extends RangerPolicyResourceEvaluator> {
+        private String str;
+        private Map<Character, TrieNode<U>> children = new HashMap<>();
+        private List<U> evaluators;
+        private List<U> wildcardEvaluators;
+        private boolean isSharingParentWildcardEvaluators;
 
-    TrieNode(Character c) {
-        this.c = c;
-    }
+        TrieNode(String str) {
+            this.str = str;
+        }
 
-    Character getChar() {
-        return c;
-    }
+        String getStr() {
+            return str;
+        }
 
-    Map<Character, TrieNode> getChildren() {
-        return children;
-    }
+        void setStr(String str) {
+            this.str = str;
+        }
 
-    List<T> getEvaluators() {
-        return evaluators;
-    }
+        Map<Character, TrieNode<U>> getChildren() {
+            return children;
+        }
 
-    List<T> getWildcardEvaluators() {
-        return wildcardEvaluators;
-    }
+        List<U> getEvaluators() {
+            return evaluators;
+        }
 
-    TrieNode getChild(Character c) {
-        TrieNode ret = children == null ? null : children.get(c);
+        List<U> getWildcardEvaluators() {
+            return wildcardEvaluators;
+        }
 
-        return ret;
-    }
+        TrieNode<U> getChild(Character ch) {
+            return children == null ? null : children.get(ch);
+        }
 
-    void populateTrieData(RangerResourceTrie.TrieData trieData) {
-        trieData.nodeCount++;
+        void populateTrieData(RangerResourceTrie.TrieData trieData) {
+            trieData.nodeCount++;
 
-        if(wildcardEvaluators != null) {
-            if(isSharingParentWildcardEvaluators) {
-                trieData.wildcardEvaluatorListRefCount++;
-            } else {
-                trieData.wildcardEvaluatorListCount++;
+            if (wildcardEvaluators != null) {
+                if (isSharingParentWildcardEvaluators) {
+                    trieData.wildcardEvaluatorListRefCount++;
+                } else {
+                    trieData.wildcardEvaluatorListCount++;
+                }
             }
-        }
 
-        if(evaluators != null) {
-            if(evaluators == wildcardEvaluators) {
-                trieData.evaluatorListRefCount++;
-            } else {
-                trieData.evaluatorListCount++;
+            if (evaluators != null) {
+                if (evaluators == wildcardEvaluators) {
+                    trieData.evaluatorListRefCount++;
+                } else {
+                    trieData.evaluatorListCount++;
+                }
             }
-        }
 
-        if(children != null && children.size() > 0) {
-            if(children.size() == 1) {
-                trieData.singleChildNodeCount++;
-            }
+            if (children != null && !children.isEmpty()) {
+                if (children.size() == 1) {
+                    trieData.singleChildNodeCount++;
+                }
 
-            for(Map.Entry<Character, TrieNode> entry : children.entrySet()) {
-                TrieNode child = entry.getValue();
+                for (Map.Entry<Character, TrieNode<U>> entry : children.entrySet()) {
+                    TrieNode child = entry.getValue();
 
-                child.populateTrieData(trieData);
+                    child.populateTrieData(trieData);
+                }
+            } else {
+                trieData.leafNodeCount++;
             }
-        } else {
-            trieData.leafNodeCount++;
         }
-    }
 
-    int getMaxDepth() {
-        int ret = 0;
+        int getMaxDepth() {
+            int ret = 0;
 
-        if(children != null) {
-            for(Map.Entry<Character, TrieNode> entry : children.entrySet()) {
-                TrieNode child = entry.getValue();
+            if (children != null) {
+                for (Map.Entry<Character, TrieNode<U>> entry : children.entrySet()) {
+                    TrieNode<U> child = entry.getValue();
 
-                int maxChildDepth = child.getMaxDepth();
+                    int maxChildDepth = child.getMaxDepth();
 
-                if(maxChildDepth > ret) {
-                    ret = maxChildDepth;
+                    if (maxChildDepth > ret) {
+                        ret = maxChildDepth;
+                    }
                 }
             }
-        }
 
-        return ret + 1;
-    }
-
-    TrieNode getOrCreateChild(Character c) {
-        if(children == null) {
-            children = new HashMap<Character, TrieNode>();
+            return ret + 1;
         }
 
-        TrieNode child = children.get(c);
+        TrieNode<U> getOrCreateChild(String str) {
+            int len = str.length();
 
-        if(child == null) {
-            child = new TrieNode(c);
-            children.put(c, child);
-        }
+            TrieNode<U> child = children.get(getLookupChar(str, 0));
 
-        return child;
-    }
+            if (child == null) {
+                child = new TrieNode<>(str);
+                addChild(child);
+            } else {
+                final String childStr = child.getStr();
+                final int childStrLen = childStr.length();
+
+                if (!StringUtils.equals(childStr, str)) {
+                    final int numOfCharactersToMatch = childStrLen < len ? childStrLen : len;
+                    int index = 1;
+                    for (; index < numOfCharactersToMatch; index++) {
+                        if (getLookupChar(childStr, index) != getLookupChar(str, index)) {
+                            break;
+                        }
+                    }
+                    if (index == numOfCharactersToMatch) {
+                        // Matched all
+                        if (childStrLen > len) {
+                            // Existing node has longer string, need to break up this node
+                            TrieNode<U> newChild = new TrieNode<>(str);
+                            this.addChild(newChild);
+                            child.setStr(childStr.substring(index));
+                            newChild.addChild(child);
+                            child = newChild;
+                        } else {
+                            // This is a longer string, build a child with leftover string
+                            child = child.getOrCreateChild(str.substring(index));
+                        }
+                    } else {
+                        // Partial match for both; both have leftovers
+                        String matchedPart = str.substring(0, index);
+                        TrieNode<U> newChild = new TrieNode<>(matchedPart);
+                        this.addChild(newChild);
+                        child.setStr(childStr.substring(index));
+                        newChild.addChild(child);
+                        child = newChild.getOrCreateChild(str.substring(index));
+                    }
+                }
+            }
 
-    void addEvaluator(T evaluator) {
-        if(evaluators == null) {
-            evaluators = new ArrayList<T>();
+            return child;
         }
 
-        if(!evaluators.contains(evaluator)) {
-            evaluators.add(evaluator);
+        private void addChild(TrieNode<U> child) {
+            children.put(getLookupChar(child.getStr(), 0), child);
         }
-    }
 
-    void addWildcardEvaluator(T evaluator) {
-        if(wildcardEvaluators == null) {
-            wildcardEvaluators = new ArrayList<T>();
-        }
+        void addEvaluator(U evaluator) {
+            if (evaluators == null) {
+                evaluators = new ArrayList<>();
+            }
 
-        if(!wildcardEvaluators.contains(evaluator)) {
-            wildcardEvaluators.add(evaluator);
+            if (!evaluators.contains(evaluator)) {
+                evaluators.add(evaluator);
+            }
         }
-    }
 
-    void postSetup(List<T> parentWildcardEvaluators, Comparator<T> comparator) {
-        // finalize wildcard-evaluators list by including parent's wildcard evaluators
-        if(parentWildcardEvaluators != null) {
-            if(CollectionUtils.isEmpty(this.wildcardEvaluators)) {
-                this.wildcardEvaluators = parentWildcardEvaluators;
-            } else {
-                for (T evaluator : parentWildcardEvaluators) {
-                    addWildcardEvaluator(evaluator);
-                }
+        void addWildcardEvaluator(U evaluator) {
+            if (wildcardEvaluators == null) {
+                wildcardEvaluators = new ArrayList<>();
+            }
+
+            if (!wildcardEvaluators.contains(evaluator)) {
+                wildcardEvaluators.add(evaluator);
             }
         }
-        this.isSharingParentWildcardEvaluators = wildcardEvaluators == parentWildcardEvaluators;
 
-        // finalize evaluators list by including wildcard evaluators
-        if(wildcardEvaluators != null) {
-            if(CollectionUtils.isEmpty(this.evaluators)) {
-                this.evaluators = wildcardEvaluators;
-            } else {
-                for (T evaluator : wildcardEvaluators) {
-                    addEvaluator(evaluator);
+        void postSetup(List<U> parentWildcardEvaluators, Comparator<U> comparator) {
+            // finalize wildcard-evaluators list by including parent's wildcard evaluators
+            if (parentWildcardEvaluators != null) {
+                if (CollectionUtils.isEmpty(this.wildcardEvaluators)) {
+                    this.wildcardEvaluators = parentWildcardEvaluators;
+                } else {
+                    for (U evaluator : parentWildcardEvaluators) {
+                        addWildcardEvaluator(evaluator);
+                    }
                 }
             }
-        }
+            this.isSharingParentWildcardEvaluators = wildcardEvaluators == parentWildcardEvaluators;
 
-        if (comparator != null) {
-            if (!isSharingParentWildcardEvaluators && CollectionUtils.isNotEmpty(wildcardEvaluators)) {
-                Collections.sort(wildcardEvaluators, comparator);
+            // finalize evaluators list by including wildcard evaluators
+            if (wildcardEvaluators != null) {
+                if (CollectionUtils.isEmpty(this.evaluators)) {
+                    this.evaluators = wildcardEvaluators;
+                } else {
+                    for (U evaluator : wildcardEvaluators) {
+                        addEvaluator(evaluator);
+                    }
+                }
             }
 
-            if (evaluators != wildcardEvaluators && CollectionUtils.isNotEmpty(evaluators)) {
-                Collections.sort(evaluators, comparator);
+            if (comparator != null) {
+                if (!isSharingParentWildcardEvaluators && CollectionUtils.isNotEmpty(wildcardEvaluators)) {
+                    wildcardEvaluators.sort(comparator);
+                }
+
+                if (evaluators != wildcardEvaluators && CollectionUtils.isNotEmpty(evaluators)) {
+                    evaluators.sort(comparator);
+                }
             }
-        }
 
-        if(children != null) {
-            for(Map.Entry<Character, TrieNode> entry : children.entrySet()) {
-                TrieNode child = entry.getValue();
+            if (children != null) {
+                for (Map.Entry<Character, TrieNode<U>> entry : children.entrySet()) {
+                    TrieNode<U> child = entry.getValue();
 
-                child.postSetup(wildcardEvaluators, comparator);
+                    child.postSetup(wildcardEvaluators, comparator);
+                }
             }
         }
-    }
 
-    public void toString(String prefix, StringBuilder sb) {
-        String nodeValue = prefix;
+        public void toString(String prefix, StringBuilder sb) {
+            String nodeValue = prefix;
 
-        if(c != 0) {
-            nodeValue += c;
-        }
+            if (str != null) {
+                nodeValue += str;
+            }
 
-        sb.append("nodeValue=").append(nodeValue);
-        sb.append("; childCount=").append(children == null ? 0 : children.size());
-        sb.append("; evaluators=[ ");
-        if(evaluators != null) {
-            for(T evaluator : evaluators) {
-                sb.append(evaluator.getId()).append(" ");
+            sb.append("nodeValue=").append(nodeValue);
+            sb.append("; childCount=").append(children == null ? 0 : children.size());
+            sb.append("; evaluators=[ ");
+            if (evaluators != null) {
+                for (U evaluator : evaluators) {
+                    sb.append(evaluator.getId()).append(" ");
+                }
             }
-        }
-        sb.append("]");
+            sb.append("]");
 
-        sb.append("; wildcardEvaluators=[ ");
-        if(wildcardEvaluators != null) {
-            for(T evaluator : wildcardEvaluators) {
-                sb.append(evaluator.getId()).append(" ");
+            sb.append("; wildcardEvaluators=[ ");
+            if (wildcardEvaluators != null) {
+                for (U evaluator : wildcardEvaluators) {
+                    sb.append(evaluator.getId()).append(" ");
+                }
             }
-        }
-        sb.append("]");
-        sb.append(Character.LINE_SEPARATOR);
+            sb.append("]\n");
 
-        if(children != null) {
-            for(Map.Entry<Character, TrieNode> entry : children.entrySet()) {
-                TrieNode child = entry.getValue();
+            if (children != null) {
+                for (Map.Entry<Character, TrieNode<U>> entry : children.entrySet()) {
+                    TrieNode<U> child = entry.getValue();
 
-                child.toString(nodeValue, sb);
+                    child.toString(nodeValue, sb);
+                }
             }
         }
-    }
 
-    public void clear() {
-        children           = null;
-        evaluators         = null;
-        wildcardEvaluators = null;
+        public void clear() {
+            children = null;
+            evaluators = null;
+            wildcardEvaluators = null;
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/ranger/blob/6a6e955b/agents-common/src/test/resources/log4j.xml
----------------------------------------------------------------------
diff --git a/agents-common/src/test/resources/log4j.xml b/agents-common/src/test/resources/log4j.xml
index d863cf1..802c308 100644
--- a/agents-common/src/test/resources/log4j.xml
+++ b/agents-common/src/test/resources/log4j.xml
@@ -35,6 +35,20 @@
             <param name="ConversionPattern" value="%d [%t] %m%n" />
         </layout>
     </appender>
+    <!--
+    <logger name="org.apache.ranger.perf.resourcetrie" additivity="false">
+        <level value="debug" />
+        <appender-ref ref="ranger_perf_appender" />
+    </logger>
+    <logger name="org.apache.ranger.perf.policyengine.getResourceACLs" additivity="false">
+        <level value="debug" />
+        <appender-ref ref="ranger_perf_appender" />
+    </logger>
+
+    <logger name="org.apache.ranger.perf.policy.init.ACLSummary" additivity="false">
+        <level value="debug" />
+        <appender-ref ref="ranger_perf_appender" />
+    </logger>
 
     <logger name="org.apache.ranger.perf.policyengine" additivity="false">
         <level value="debug" />


[2/2] ranger git commit: RANGER-2173: Optimize Trie constuction and Policy lookup - Part II

Posted by ab...@apache.org.
RANGER-2173: Optimize Trie constuction and Policy lookup
- Part II


Project: http://git-wip-us.apache.org/repos/asf/ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/ranger/commit/4bdfbd68
Tree: http://git-wip-us.apache.org/repos/asf/ranger/tree/4bdfbd68
Diff: http://git-wip-us.apache.org/repos/asf/ranger/diff/4bdfbd68

Branch: refs/heads/ranger-0.7
Commit: 4bdfbd68e9d44ba45223cf8a44f0be46db76afd3
Parents: 6a6e955
Author: Abhay Kulkarni <ak...@hortonworks.com>
Authored: Sun Aug 5 09:01:24 2018 -0700
Committer: Abhay Kulkarni <ak...@hortonworks.com>
Committed: Wed Sep 26 20:21:42 2018 -0700

----------------------------------------------------------------------
 .../org/apache/ranger/plugin/util/RangerResourceTrie.java | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ranger/blob/4bdfbd68/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerResourceTrie.java
----------------------------------------------------------------------
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 a255566..ece577d 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
@@ -122,9 +122,11 @@ public class RangerResourceTrie<T extends RangerPolicyResourceEvaluator> {
 
         RangerPerfTracer.logAlways(perf);
 
-        if (PERF_TRIE_INIT_LOG.isTraceEnabled()) {
-            PERF_TRIE_INIT_LOG.trace(toString());
+        if (PERF_TRIE_INIT_LOG.isDebugEnabled()) {
+            PERF_TRIE_INIT_LOG.debug(toString());
+        }
 
+        if (PERF_TRIE_INIT_LOG.isTraceEnabled()) {
             StringBuilder sb = new StringBuilder();
             root.toString("", sb);
             PERF_TRIE_INIT_LOG.trace("Trie Dump:\n{" + sb.toString() + "}");
@@ -425,7 +427,9 @@ public class RangerResourceTrie<T extends RangerPolicyResourceEvaluator> {
                 final String childStr = child.getStr();
                 final int childStrLen = childStr.length();
 
-                if (!StringUtils.equals(childStr, str)) {
+                final boolean isExactMatch = optIgnoreCase ? StringUtils.equalsIgnoreCase(childStr, str) : StringUtils.equals(childStr, str);
+
+                if (!isExactMatch) {
                     final int numOfCharactersToMatch = childStrLen < len ? childStrLen : len;
                     int index = 1;
                     for (; index < numOfCharactersToMatch; index++) {