From 2d7c5322a79e0ffa45676e50f3453d5530af78c2 Mon Sep 17 00:00:00 2001 From: Justin Bertram Date: Wed, 8 Aug 2018 11:10:04 -0500 Subject: [PATCH] ARTEMIS-2017 Eliminate LRUCache from SelectorParser The LRUCache is not thread-safe and it's usage in SelectorParser could cause growth beyond its configured max size. Instead of modifying the LRUCache to be thread-safe or synchronizing access to it in SelectorParser it should just be removed since it's not on a hot path. --- .../artemis/selector/impl/SelectorParser.java | 102 ++++++++---------- 1 file changed, 43 insertions(+), 59 deletions(-) diff --git a/artemis-selector/src/main/java/org/apache/activemq/artemis/selector/impl/SelectorParser.java b/artemis-selector/src/main/java/org/apache/activemq/artemis/selector/impl/SelectorParser.java index 6812f9ab0d..f169541efb 100644 --- a/artemis-selector/src/main/java/org/apache/activemq/artemis/selector/impl/SelectorParser.java +++ b/artemis-selector/src/main/java/org/apache/activemq/artemis/selector/impl/SelectorParser.java @@ -24,77 +24,61 @@ import org.apache.activemq.artemis.selector.filter.FilterException; import org.apache.activemq.artemis.selector.hyphenated.HyphenatedParser; import org.apache.activemq.artemis.selector.strict.StrictParser; -/** - */ public class SelectorParser { - private static final LRUCache cache = new LRUCache<>(100); private static final String CONVERT_STRING_EXPRESSIONS_PREFIX = "convert_string_expressions:"; private static final String HYPHENATED_PROPS_PREFIX = "hyphenated_props:"; private static final String NO_CONVERT_STRING_EXPRESSIONS_PREFIX = "no_convert_string_expressions:"; private static final String NO_HYPHENATED_PROPS_PREFIX = "no_hyphenated_props:"; public static BooleanExpression parse(String sql) throws FilterException { - Object result = cache.get(sql); - if (result instanceof FilterException) { - throw (FilterException) result; - } else if (result instanceof BooleanExpression) { - return (BooleanExpression) result; - } else { - String actual = sql; - boolean convertStringExpressions = false; - boolean hyphenatedProps = false; - while (true) { - if (actual.startsWith(CONVERT_STRING_EXPRESSIONS_PREFIX)) { - convertStringExpressions = true; - actual = actual.substring(CONVERT_STRING_EXPRESSIONS_PREFIX.length()); - continue; - } - if (actual.startsWith(HYPHENATED_PROPS_PREFIX)) { - hyphenatedProps = true; - actual = actual.substring(HYPHENATED_PROPS_PREFIX.length()); - continue; - } - if (actual.startsWith(NO_CONVERT_STRING_EXPRESSIONS_PREFIX)) { - convertStringExpressions = false; - actual = actual.substring(NO_CONVERT_STRING_EXPRESSIONS_PREFIX.length()); - continue; - } - if (actual.startsWith(NO_HYPHENATED_PROPS_PREFIX)) { - hyphenatedProps = false; - actual = actual.substring(NO_HYPHENATED_PROPS_PREFIX.length()); - continue; - } - break; + String actual = sql; + boolean convertStringExpressions = false; + boolean hyphenatedProps = false; + while (true) { + if (actual.startsWith(CONVERT_STRING_EXPRESSIONS_PREFIX)) { + convertStringExpressions = true; + actual = actual.substring(CONVERT_STRING_EXPRESSIONS_PREFIX.length()); + continue; } + if (actual.startsWith(HYPHENATED_PROPS_PREFIX)) { + hyphenatedProps = true; + actual = actual.substring(HYPHENATED_PROPS_PREFIX.length()); + continue; + } + if (actual.startsWith(NO_CONVERT_STRING_EXPRESSIONS_PREFIX)) { + convertStringExpressions = false; + actual = actual.substring(NO_CONVERT_STRING_EXPRESSIONS_PREFIX.length()); + continue; + } + if (actual.startsWith(NO_HYPHENATED_PROPS_PREFIX)) { + hyphenatedProps = false; + actual = actual.substring(NO_HYPHENATED_PROPS_PREFIX.length()); + continue; + } + break; + } - if (convertStringExpressions) { - ComparisonExpression.CONVERT_STRING_EXPRESSIONS.set(true); + if (convertStringExpressions) { + ComparisonExpression.CONVERT_STRING_EXPRESSIONS.set(true); + } + try { + BooleanExpression e = null; + if (hyphenatedProps) { + HyphenatedParser parser = new HyphenatedParser(new StringReader(actual)); + e = parser.JmsSelector(); + } else { + StrictParser parser = new StrictParser(new StringReader(actual)); + e = parser.JmsSelector(); } - try { - BooleanExpression e = null; - if (hyphenatedProps) { - HyphenatedParser parser = new HyphenatedParser(new StringReader(actual)); - e = parser.JmsSelector(); - } else { - StrictParser parser = new StrictParser(new StringReader(actual)); - e = parser.JmsSelector(); - } - cache.put(sql, e); - return e; - } catch (Throwable e) { - FilterException fe = new FilterException(actual, e); - cache.put(sql, fe); - throw fe; - } finally { - if (convertStringExpressions) { - ComparisonExpression.CONVERT_STRING_EXPRESSIONS.remove(); - } + return e; + } catch (Throwable e) { + FilterException fe = new FilterException(actual, e); + throw fe; + } finally { + if (convertStringExpressions) { + ComparisonExpression.CONVERT_STRING_EXPRESSIONS.remove(); } } } - - public static void clearCache() { - cache.clear(); - } }