From d9588286689bae6b6a37f0f0e9045a0c700ba82d Mon Sep 17 00:00:00 2001 From: Andrew Azores Date: Mon, 22 Jan 2024 11:14:12 -0500 Subject: [PATCH 1/5] handle expression update --- .../java/io/cryostat/expressions/MatchExpressionEvaluator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java index 4181a17c4..a54e02778 100644 --- a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java +++ b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java @@ -68,6 +68,8 @@ void onMessage(ExpressionEvent event) { invalidate(event.expression().script); break; case UPDATED: + // expression scripts aren't meant to be updatable, but handle them by invalidating cached results just in case + invalidate(event.expression().script); break; default: break; From 9464294fde0694ae8dc8d7bdd15972c510e229ef Mon Sep 17 00:00:00 2001 From: Andrew Azores Date: Mon, 22 Jan 2024 11:14:21 -0500 Subject: [PATCH 2/5] remove unused method --- .../java/io/cryostat/expressions/MatchExpressionEvaluator.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java index a54e02778..574eefd1b 100644 --- a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java +++ b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java @@ -102,9 +102,6 @@ boolean load(String matchExpression, Target target) throws ScriptException { return script.execute(Boolean.class, Map.of("target", SimplifiedTarget.from(target))); } - @CacheInvalidate(cacheName = CACHE_NAME) - void invalidate(String matchExpression, Target target) {} - void invalidate(String matchExpression) { Optional cache = cacheManager.getCache(CACHE_NAME); if (cache.isPresent()) { From c4952414ca52a89de43a709fcb2af2340cd98bcf Mon Sep 17 00:00:00 2001 From: Andrew Azores Date: Mon, 22 Jan 2024 11:14:36 -0500 Subject: [PATCH 3/5] spotless:apply --- .../io/cryostat/expressions/MatchExpressionEvaluator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java index 574eefd1b..92f046625 100644 --- a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java +++ b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java @@ -30,7 +30,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.quarkus.cache.Cache; -import io.quarkus.cache.CacheInvalidate; import io.quarkus.cache.CacheManager; import io.quarkus.cache.CacheResult; import io.quarkus.cache.CaffeineCache; @@ -68,7 +67,8 @@ void onMessage(ExpressionEvent event) { invalidate(event.expression().script); break; case UPDATED: - // expression scripts aren't meant to be updatable, but handle them by invalidating cached results just in case + // expression scripts aren't meant to be updatable, but handle them by invalidating + // cached results just in case invalidate(event.expression().script); break; default: From d502caf9c056085443f9e6f610485131d7d60433 Mon Sep 17 00:00:00 2001 From: Andrew Azores Date: Mon, 22 Jan 2024 11:30:41 -0500 Subject: [PATCH 4/5] fix(matchexpr): correct invalidation logic --- .../expressions/MatchExpressionEvaluator.java | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java index 92f046625..f388c59b3 100644 --- a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java +++ b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.concurrent.CompletionException; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -29,10 +28,8 @@ import io.cryostat.targets.Target.Annotations; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import io.quarkus.cache.Cache; import io.quarkus.cache.CacheManager; import io.quarkus.cache.CacheResult; -import io.quarkus.cache.CaffeineCache; import io.quarkus.cache.CompositeCacheKey; import io.quarkus.vertx.ConsumeEvent; import jakarta.annotation.Nullable; @@ -103,33 +100,19 @@ boolean load(String matchExpression, Target target) throws ScriptException { } void invalidate(String matchExpression) { - Optional cache = cacheManager.getCache(CACHE_NAME); - if (cache.isPresent()) { - var it = cache.get().as(CaffeineCache.class).keySet().iterator(); - while (it.hasNext()) { - CompositeCacheKey entry = (CompositeCacheKey) it.next(); - String matchExpressionKey = (String) entry.getKeyElements()[0]; - if (Objects.equals(matchExpression, matchExpressionKey)) { - cache.get() - .invalidate(entry) - .invoke( - () -> { - logger.debugv( - "Expression {0} invalidated in cache {1}", - matchExpression, CACHE_NAME); - }) - .subscribe() - .with( - (v) -> {}, - (e) -> { - logger.errorv( - "Error invalidating expression {0} in cache {1}:" - + " {2}", - matchExpression, CACHE_NAME, e); - }); - } - } - } + // 0-index is important here. the argument order of the load() method determines the + // composite key order + cacheManager + .getCache(CACHE_NAME) + .ifPresent( + c -> + c.invalidateIf( + k -> + Objects.equals( + (String) + ((CompositeCacheKey) k) + .getKeyElements()[0], + matchExpression))); } public boolean applies(MatchExpression matchExpression, Target target) throws ScriptException { From a3e97ff5f8e7aafb2a381d1c79438d350eaf101d Mon Sep 17 00:00:00 2001 From: Andrew Azores Date: Mon, 22 Jan 2024 11:30:52 -0500 Subject: [PATCH 5/5] rename cache and apply default size --- .../java/io/cryostat/expressions/MatchExpressionEvaluator.java | 2 +- src/main/resources/application.properties | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java index f388c59b3..ac33b70e3 100644 --- a/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java +++ b/src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java @@ -49,7 +49,7 @@ @ApplicationScoped public class MatchExpressionEvaluator { - private static final String CACHE_NAME = "match-expression-cache"; + private static final String CACHE_NAME = "matchexpressions"; @Inject ScriptHost scriptHost; @Inject Logger logger; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e0652a7c6..46b4bf36b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,6 +12,7 @@ cryostat.messaging.queue.size=1024 cryostat.services.reports.url= quarkus.cache.enabled=true cryostat.services.reports.memory-cache.enabled=true +quarkus.cache.caffeine.matchexpressions.maximum-size=512 quarkus.cache.caffeine.activereports.expire-after-write=10s quarkus.cache.caffeine.archivedreports.expire-after-access=10m cryostat.services.reports.storage-cache.enabled=true