cache

fix cache-methods file loading continuously. fix ttls file

4/3/2021 3:21:32 PM

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/cache/Caffeine.java b/src/main/java/br/ufrgs/inf/prosoft/cache/Caffeine.java
index 2612978..832f9a8 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/cache/Caffeine.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/cache/Caffeine.java
@@ -9,18 +9,22 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BiConsumer;
+import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
 public class Caffeine<K, V> implements Cache<K, V>, AutoCloseable {
 
   private static final Logger LOGGER = Logger.getLogger(Caffeine.class.getName());
+
   private static final boolean CACHE_EVALUATE_PERFORMANCE = System.getenv("CACHE_EVENTS") == null || !System.getenv("CACHE_EVENTS").equals("false");
   private static final boolean CACHE_REGISTER_SIZE = System.getenv("CACHE_REGISTER_SIZE") != null && System.getenv("CACHE_REGISTER_SIZE").equals("true");
   private static final boolean CACHE_REFRESH_TTL = System.getenv("CACHE_REFRESH_TTL") != null && System.getenv("CACHE_REFRESH_TTL").equals("true");
-  private static final String CACHE_METHODS_TTL = System.getenv("CACHE_METHODS_TTL") != null && !System.getenv("CACHE_METHODS_TTL").isEmpty() && !System.getenv("CACHE_METHODS_TTL").equals("null")
+
+  private static String CACHE_METHODS_TTL = System.getenv("CACHE_METHODS_TTL") != null && !System.getenv("CACHE_METHODS_TTL").isEmpty() && !System.getenv("CACHE_METHODS_TTL").equals("null")
     ? System.getenv("CACHE_METHODS_TTL") : null;
   private static final Map<String, Long> METHOD_HAS_TTL = new HashMap<>();
+
   private final com.github.benmanes.caffeine.cache.Cache<Optional<K>, Optional<V>> cache;
   private final ConcurrentHashMap<Optional<K>, Long> keyHasTTL;
   private final CachePerformance cachePerformance;
@@ -89,11 +93,12 @@ public class Caffeine<K, V> implements Cache<K, V>, AutoCloseable {
       this.cachePerformance.registerEvent(EventType.POPULATION, String.valueOf(size())), 0, 5, TimeUnit.SECONDS);
   }
 
-  private synchronized static void loadCacheableParameters() {
+  private synchronized static void loadTTLsForMethods() {
     if (CACHE_METHODS_TTL == null) return;
-    if (METHOD_HAS_TTL.isEmpty()) return;
     CSV methodsHasTTL = CSV.read(CACHE_METHODS_TTL);
     methodsHasTTL.stream().forEach(it -> METHOD_HAS_TTL.put(it.get("method"), Long.valueOf(it.get("ttl"))));
+    LOGGER.log(Level.INFO, "TTLs for methods file loaded");
+    CACHE_METHODS_TTL = null;
   }
 
   @Override
@@ -109,30 +114,30 @@ public class Caffeine<K, V> implements Cache<K, V>, AutoCloseable {
     return this.cachePerformance;
   }
 
-  private Long getTTLForMethod() {
-    loadCacheableParameters();
-    if (METHOD_HAS_TTL.isEmpty()) return null;
+  private long getTTLForMethod() {
+    loadTTLsForMethods();
+    if (METHOD_HAS_TTL.isEmpty()) return 0;
     StackTraceElement[] traceElements = Thread.currentThread().getStackTrace();
     for (int i = 3; i < traceElements.length; i++) {
       String methodName = traceElements[i].getClassName() + "." + traceElements[i].getMethodName();
       if (METHOD_HAS_TTL.containsKey(methodName)) return METHOD_HAS_TTL.get(methodName);
     }
-    return null;
+    return 0;
   }
 
   @Override
   public void put(K key, V value, long timeToLive) {
-    Long ttl = getTTLForMethod();
-    if (ttl != null) timeToLive = ttl;
-    this.keyHasTTL.put(Optional.ofNullable(key), timeToLive);
+    long ttl = getTTLForMethod();
+    if (ttl > 0) timeToLive = ttl;
+    if (timeToLive > 0) this.keyHasTTL.put(Optional.ofNullable(key), timeToLive);
     put(key, value);
   }
 
   @Override
   public void put(K key, V value) {
     if (!this.keyHasTTL.containsKey(Optional.ofNullable(key))) {
-      Long ttl = getTTLForMethod();
-      if (ttl != null) this.keyHasTTL.put(Optional.ofNullable(key), ttl);
+      long ttl = getTTLForMethod();
+      if (ttl > 0) this.keyHasTTL.put(Optional.ofNullable(key), ttl);
     }
     this.cache.put(Optional.ofNullable(key), Optional.ofNullable(value));
     registerEvent(EventType.ADDITION, value);
diff --git a/src/main/java/br/ufrgs/inf/prosoft/cache/tools/CSV.java b/src/main/java/br/ufrgs/inf/prosoft/cache/tools/CSV.java
index 6910a16..762bbfe 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/cache/tools/CSV.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/cache/tools/CSV.java
@@ -57,7 +57,7 @@ public class CSV implements Iterable<Row> {
       lines.forEach(line -> csv.append(process(line)));
       return csv;
     } catch (IOException ex) {
-      throw new RuntimeException("Cannot read file");
+      throw new RuntimeException("Cannot read file " + path);
     }
   }