Repository: incubator-metron Updated Branches: refs/heads/master fccb67aec -> 8f1dc5af9
METRON-820: StellarProcessor should have a static expression cache. This closes apache/incubator-metron#508 Project: http://git-wip-us.apache.org/repos/asf/incubator-metron/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-metron/commit/8f1dc5af Tree: http://git-wip-us.apache.org/repos/asf/incubator-metron/tree/8f1dc5af Diff: http://git-wip-us.apache.org/repos/asf/incubator-metron/diff/8f1dc5af Branch: refs/heads/master Commit: 8f1dc5af946e30ec280c99f6620a5de4f46ffe27 Parents: fccb67a Author: cstella <ceste...@gmail.com> Authored: Wed Apr 5 09:40:00 2017 -0400 Committer: cstella <ceste...@gmail.com> Committed: Wed Apr 5 09:40:00 2017 -0400 ---------------------------------------------------------------------- .../common/stellar/BaseStellarProcessor.java | 41 +++++++++++++++----- .../stellar/StellarPredicateProcessor.java | 3 ++ .../metron/common/stellar/StellarProcessor.java | 12 ++++++ 3 files changed, 46 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/8f1dc5af/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/BaseStellarProcessor.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/BaseStellarProcessor.java b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/BaseStellarProcessor.java index afd92b8..a04ee43 100644 --- a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/BaseStellarProcessor.java +++ b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/BaseStellarProcessor.java @@ -55,6 +55,17 @@ import static org.apache.commons.lang3.StringUtils.isEmpty; * @see StellarPredicateProcessor */ public class BaseStellarProcessor<T> { + public static final int DEFAULT_CACHE_SIZE = 500; + public static final int DEFAULT_EXPIRY_TIME = 10; + public static final TimeUnit DEFAULT_EXPIRY_TIME_UNITS = TimeUnit.MINUTES; + + /** + * The default expression cache. This is used when the expression cache is not otherwise specified. + */ + private static Cache<String, StellarCompiler.Expression> defaultExpressionCache; + static { + defaultExpressionCache = createCache(DEFAULT_CACHE_SIZE, DEFAULT_EXPIRY_TIME, DEFAULT_EXPIRY_TIME_UNITS); + } /** * The class containing the type that the Stellar expression being processed will evaluate to. */ @@ -65,26 +76,36 @@ public class BaseStellarProcessor<T> { */ Cache<String, StellarCompiler.Expression> expressionCache; - public static final int DEFAULT_CACHE_SIZE = 500; - public static final int DEFAULT_EXPIRY_TIME = 10; - public static final TimeUnit DEFAULT_EXPIRY_TIME_UNITS = TimeUnit.MINUTES; - + /** + * Create a default stellar processor. This processor uses the static expression cache. + */ BaseStellarProcessor(final Class<T> clazz) { - this(clazz, DEFAULT_CACHE_SIZE, DEFAULT_EXPIRY_TIME, DEFAULT_EXPIRY_TIME_UNITS); + this(clazz, defaultExpressionCache); } BaseStellarProcessor(final Class<T> clazz, int cacheSize, int expiryTime, TimeUnit expiryUnit) { + this(clazz, createCache(cacheSize, expiryTime, expiryUnit)); + } + + BaseStellarProcessor(final Class<T> clazz, Cache<String, StellarCompiler.Expression> expressionCache) { this.clazz = clazz; + this.expressionCache = expressionCache; + } + + static Cache<String, StellarCompiler.Expression> createCache( int cacheSize + , int expiryTime + , TimeUnit expiryUnit + ) { CacheLoader<String, StellarCompiler.Expression> loader = new CacheLoader<String, StellarCompiler.Expression>() { @Override public StellarCompiler.Expression load(String key) throws Exception { return compile(key); } }; - expressionCache = CacheBuilder.newBuilder() - .maximumSize(cacheSize) - .expireAfterAccess(expiryTime, expiryUnit) - .build(loader); + return CacheBuilder.newBuilder() + .maximumSize(cacheSize) + .expireAfterAccess(expiryTime, expiryUnit) + .build(loader); } /** @@ -132,7 +153,7 @@ public class BaseStellarProcessor<T> { * @param rule The Stellar expression to parse and evaluate. * @return The Expression, which can be reevaluated without reparsing in different Contexts and Resolvers. */ - public StellarCompiler.Expression compile(final String rule) { + public static StellarCompiler.Expression compile(final String rule) { if (rule == null || isEmpty(rule.trim())) { return null; } http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/8f1dc5af/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarPredicateProcessor.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarPredicateProcessor.java b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarPredicateProcessor.java index 581c9c1..bbde172 100644 --- a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarPredicateProcessor.java +++ b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarPredicateProcessor.java @@ -36,6 +36,9 @@ import static org.apache.commons.lang3.StringUtils.isEmpty; public class StellarPredicateProcessor extends BaseStellarProcessor<Boolean> { + /** + * Create a default stellar processor. This processor uses the static expression cache. + */ public StellarPredicateProcessor() { super(Boolean.class); } http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/8f1dc5af/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarProcessor.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarProcessor.java b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarProcessor.java index ae6238b..22a556a 100644 --- a/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarProcessor.java +++ b/metron-platform/metron-common/src/main/java/org/apache/metron/common/stellar/StellarProcessor.java @@ -18,6 +18,8 @@ package org.apache.metron.common.stellar; +import com.google.common.cache.Cache; + import java.util.concurrent.TimeUnit; /** @@ -29,10 +31,20 @@ import java.util.concurrent.TimeUnit; */ public class StellarProcessor extends BaseStellarProcessor<Object> { + /** + * Create a default stellar processor. This processor uses the static expression cache. + */ public StellarProcessor() { super(Object.class); } + /** + * Create a stellar processor with a new expression cache. NOTE: This object should be reused to prevent + * performance regressions. + * @param cacheSize + * @param expiryTime + * @param expiryUnit + */ public StellarProcessor(int cacheSize, int expiryTime, TimeUnit expiryUnit) { super(Object.class, cacheSize, expiryTime, expiryUnit); }