azkaban-aplcache

added aplcache cache

7/12/2019 3:39:41 AM

Details

diff --git a/azkaban-common/build.gradle b/azkaban-common/build.gradle
index d747d52..658344f 100644
--- a/azkaban-common/build.gradle
+++ b/azkaban-common/build.gradle
@@ -14,13 +14,7 @@
  * the License.
  */
 
-plugins {
-    id "io.freefair.aspectj.post-compile-weaving" version "3.1.4"
-}
-
 dependencies {
-    aspect 'br.ufrgs.inf.prosoft.applicationtracer:ApplicationTracer:1.0'
-
     compile project(':az-core')
     compile project(':azkaban-spi')
     compile project(':azkaban-db')
diff --git a/azkaban-common/src/main/java/azkaban/executor/ExecutionFlowDao.java b/azkaban-common/src/main/java/azkaban/executor/ExecutionFlowDao.java
index bc9e9df..dd829e3 100644
--- a/azkaban-common/src/main/java/azkaban/executor/ExecutionFlowDao.java
+++ b/azkaban-common/src/main/java/azkaban/executor/ExecutionFlowDao.java
@@ -34,6 +34,8 @@ import javax.inject.Singleton;
 import org.apache.commons.dbutils.ResultSetHandler;
 import org.apache.log4j.Logger;
 
+import br.ufrgs.inf.prosoft.aplcache.caching.APLCache;
+
 @Singleton
 public class ExecutionFlowDao {
 
@@ -136,16 +138,21 @@ public class ExecutionFlowDao {
     }
   }
 
+  public static APLCache<List<ExecutableFlow>> fetchRecentlyFinishedFlowsCache = new APLCache<>("ExecutionFlowDao.fetchRecentlyFinishedFlows");
+
   List<ExecutableFlow> fetchRecentlyFinishedFlows(final Duration maxAge)
       throws ExecutorManagerException {
-    try {
-      return this.dbOperator.query(FetchRecentlyFinishedFlows.FETCH_RECENTLY_FINISHED_FLOW,
-          new FetchRecentlyFinishedFlows(), System.currentTimeMillis() - maxAge.toMillis(),
-          Status.SUCCEEDED.getNumVal(), Status.KILLED.getNumVal(),
-          Status.FAILED.getNumVal());
-    } catch (final SQLException e) {
-      throw new ExecutorManagerException("Error fetching recently finished flows", e);
-    }
+    return fetchRecentlyFinishedFlowsCache.computeIfAbsent(Thread.currentThread(), new Object[]{maxAge}, () -> {
+      try {
+        return this.dbOperator.query(FetchRecentlyFinishedFlows.FETCH_RECENTLY_FINISHED_FLOW,
+            new FetchRecentlyFinishedFlows(), System.currentTimeMillis() - maxAge.toMillis(),
+            Status.SUCCEEDED.getNumVal(), Status.KILLED.getNumVal(),
+            Status.FAILED.getNumVal());
+      } catch (final SQLException e) {
+        // throw new ExecutorManagerException("Error fetching recently finished flows", e);
+        return new ArrayList<ExecutableFlow>();
+      }
+    }, 1000);
   }
 
   List<ExecutableFlow> fetchFlowHistory(final String projContain, final String flowContains,
diff --git a/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java b/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java
index 0125778..7438321 100644
--- a/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java
+++ b/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java
@@ -66,6 +66,8 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.joda.time.DateTime;
 
+import br.ufrgs.inf.prosoft.cache.GetterCache;
+
 /**
  * Executor manager used to manage the client side job.
  */
@@ -595,17 +597,21 @@ public class ExecutorManager extends EventHandler implements
     }
   }
 
+public static GetterCache<List<ExecutableFlow>> getRecentlyFinishedFlowsCache = new GetterCache<>("ExecutorManager.getRecentlyFinishedFlows");
+
   @Override
   public List<ExecutableFlow> getRecentlyFinishedFlows() {
-    List<ExecutableFlow> flows = new ArrayList<>();
-    try {
-      flows = this.executorLoader.fetchRecentlyFinishedFlows(
-          RECENTLY_FINISHED_LIFETIME);
-    } catch (final ExecutorManagerException e) {
-      //Todo jamiesjc: fix error handling.
-      logger.error("Failed to fetch recently finished flows.", e);
-    }
-    return flows;
+    return getRecentlyFinishedFlowsCache.computeIfAbsent(() -> {
+      List<ExecutableFlow> flows = new ArrayList<>();
+      try {
+        flows = this.executorLoader.fetchRecentlyFinishedFlows(
+            RECENTLY_FINISHED_LIFETIME);
+      } catch (final ExecutorManagerException e) {
+        //Todo jamiesjc: fix error handling.
+        logger.error("Failed to fetch recently finished flows.", e);
+      }
+      return flows;
+    }, 1000);
   }
 
   @Override
diff --git a/azkaban-common/src/main/java/azkaban/executor/JdbcExecutorLoader.java b/azkaban-common/src/main/java/azkaban/executor/JdbcExecutorLoader.java
index da40fb7..ac48e36 100644
--- a/azkaban-common/src/main/java/azkaban/executor/JdbcExecutorLoader.java
+++ b/azkaban-common/src/main/java/azkaban/executor/JdbcExecutorLoader.java
@@ -27,6 +27,10 @@ import java.util.Map;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
+import java.util.ArrayList;
+
+import br.ufrgs.inf.prosoft.aplcache.caching.APLCache;
+
 @Singleton
 public class JdbcExecutorLoader implements ExecutorLoader {
 
@@ -85,13 +89,21 @@ public class JdbcExecutorLoader implements ExecutorLoader {
     return this.executionFlowDao.fetchQueuedFlows();
   }
 
+  public static APLCache<List<ExecutableFlow>> fetchRecentlyFinishedFlowsCache = new APLCache<>("JdbcExecutorLoader.fetchRecentlyFinishedFlows");
+
   /**
    * maxAge indicates how long finished flows are shown in Recently Finished flow page.
    */
   @Override
   public List<ExecutableFlow> fetchRecentlyFinishedFlows(final Duration maxAge)
       throws ExecutorManagerException {
-    return this.executionFlowDao.fetchRecentlyFinishedFlows(maxAge);
+    return fetchRecentlyFinishedFlowsCache.computeIfAbsent(Thread.currentThread(), new Object[]{maxAge}, () -> {
+      try {
+        return this.executionFlowDao.fetchRecentlyFinishedFlows(maxAge);
+      } catch (ExecutorManagerException ex) {
+        return new ArrayList<ExecutableFlow>();
+      }
+    }, 1000);
   }
 
   @Override
diff --git a/azkaban-common/src/main/java/azkaban/project/JdbcProjectImpl.java b/azkaban-common/src/main/java/azkaban/project/JdbcProjectImpl.java
index 677bfa6..eec3a67 100644
--- a/azkaban-common/src/main/java/azkaban/project/JdbcProjectImpl.java
+++ b/azkaban-common/src/main/java/azkaban/project/JdbcProjectImpl.java
@@ -60,6 +60,7 @@ import javax.inject.Singleton;
 import org.apache.commons.io.IOUtils;
 import org.apache.log4j.Logger;
 
+import br.ufrgs.inf.prosoft.aplcache.caching.APLCache;
 
 /**
  * This class implements ProjectLoader using new azkaban-db code to allow DB failover. TODO
@@ -181,23 +182,29 @@ public class JdbcProjectImpl implements ProjectLoader {
     return project;
   }
 
+  public static APLCache<List<Triple<String, Boolean, Permission>>> fetchPermissionsForProjectCache = new APLCache<>("JdbcProjectImpl.fetchPermissionsForProject");
+
   private List<Triple<String, Boolean, Permission>> fetchPermissionsForProject(
       final Project project)
       throws ProjectManagerException {
-    final ProjectPermissionsResultHandler permHander = new ProjectPermissionsResultHandler();
 
-    List<Triple<String, Boolean, Permission>> permissions = null;
-    try {
-      permissions =
-          this.dbOperator
-              .query(ProjectPermissionsResultHandler.SELECT_PROJECT_PERMISSION, permHander,
-                  project.getId());
-    } catch (final SQLException ex) {
-      logger.error(ProjectPermissionsResultHandler.SELECT_PROJECT_PERMISSION + " failed.", ex);
-      throw new ProjectManagerException(
-          "Query for permissions for " + project.getName() + " failed.", ex);
-    }
-    return permissions;
+    return fetchPermissionsForProjectCache.computeIfAbsent(Thread.currentThread(), new Object[]{project}, () -> {
+
+      final ProjectPermissionsResultHandler permHander = new ProjectPermissionsResultHandler();
+
+      List<Triple<String, Boolean, Permission>> permissions = null;
+      try {
+        permissions =
+            this.dbOperator
+                .query(ProjectPermissionsResultHandler.SELECT_PROJECT_PERMISSION, permHander,
+                    project.getId());
+      } catch (final SQLException ex) {
+        logger.error(ProjectPermissionsResultHandler.SELECT_PROJECT_PERMISSION + " failed.", ex);
+        throw new ProjectManagerException(
+            "Query for permissions for " + project.getName() + " failed.", ex);
+      }
+      return permissions;
+    }, 1000);
   }
 
   /**
diff --git a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
index b5a838a..4e5c486 100644
--- a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
+++ b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
@@ -47,6 +47,7 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.log4j.Logger;
 
+import br.ufrgs.inf.prosoft.aplcache.caching.APLCache;
 
 @Singleton
 public class ProjectManager {
@@ -165,15 +166,19 @@ public class ProjectManager {
     return array;
   }
 
+  public static APLCache<List<Project>> getGroupProjectsCache = new APLCache<>("ProjectManager.getGroupProjects");
+
   public List<Project> getGroupProjects(final User user) {
-    final List<Project> array = new ArrayList<>();
-    // for (final Project project : this.projectsById.values()) {
-    for (final Project project : getProjects()) {
-      if (project.hasGroupPermission(user, Type.READ)) {
-        array.add(project);
+    return getGroupProjectsCache.computeIfAbsent(Thread.currentThread(), new Object[]{user}, () -> {
+      final List<Project> array = new ArrayList<>();
+      // for (final Project project : this.projectsById.values()) {
+      for (final Project project : getProjects()) {
+        if (project.hasGroupPermission(user, Type.READ)) {
+          array.add(project);
+        }
       }
-    }
-    return array;
+      return array;
+    }, 1000);
   }
 
   public List<Project> getUserProjectsByRegex(final User user, final String regexPattern) {
diff --git a/azkaban-common/src/main/java/azkaban/utils/StringUtils.java b/azkaban-common/src/main/java/azkaban/utils/StringUtils.java
index bd27614..bcdb9c2 100644
--- a/azkaban-common/src/main/java/azkaban/utils/StringUtils.java
+++ b/azkaban-common/src/main/java/azkaban/utils/StringUtils.java
@@ -20,6 +20,8 @@ import java.util.Collection;
 import java.util.List;
 import java.util.regex.Pattern;
 
+import br.ufrgs.inf.prosoft.aplcache.caching.APLCache;
+
 public class StringUtils {
 
   public static final char SINGLE_QUOTE = '\'';
@@ -87,15 +89,19 @@ public class StringUtils {
     return buffer.toString();
   }
 
+  public static APLCache<Boolean> isFromBrowserCache = new APLCache<>("StringUtils.isFromBrowser");
+
   public static boolean isFromBrowser(final String userAgent) {
-    if (userAgent == null) {
-      return false;
-    }
+    return isFromBrowserCache.computeIfAbsent(Thread.currentThread(), new Object[]{userAgent}, () -> {
+      if (userAgent == null) {
+        return false;
+      }
 
-    if (BROWSWER_PATTERN.matcher(userAgent).matches()) {
-      return true;
-    } else {
-      return false;
-    }
+      if (BROWSWER_PATTERN.matcher(userAgent).matches()) {
+        return true;
+      } else {
+        return false;
+      }
+    }, 1000);
   }
 }
diff --git a/azkaban-exec-server/build.gradle b/azkaban-exec-server/build.gradle
index ac5d5e6..8c01c99 100644
--- a/azkaban-exec-server/build.gradle
+++ b/azkaban-exec-server/build.gradle
@@ -14,15 +14,9 @@
  * the License.
  */
 
-plugins {
-    id "io.freefair.aspectj.post-compile-weaving" version "3.1.4"
-}
-
 apply plugin: 'distribution'
 
 dependencies {
-    aspect 'br.ufrgs.inf.prosoft.applicationtracer:ApplicationTracer:1.0'
-
     compile(project(':az-core'))
     compile(project(':azkaban-common'))
 

build.gradle 2(+2 -0)

diff --git a/build.gradle b/build.gradle
index b63e397..90141b6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -165,6 +165,8 @@ subprojects {
         }
 
         dependencies {
+            compile "br.ufrgs.inf.prosoft.aplcache:APLCache:1.0"
+            compile "br.ufrgs.inf.prosoft.cache:Cache:1.0"
             compile deps.log4j
             compile deps.guice
             compile deps.slf4j
diff --git a/docker-compose.yml b/docker-compose.yml
index b213601..4a86c73 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,14 +5,11 @@ services:
     container_name: azkaban
     environment:
       - JAVA_OPTS=${JAVA_OPTS:-"-Xmx6124m"}
-      - TRACER_ENABLE=${TRACER_ENABLE:-true}
-      - TRACER_MINIMUM_EXECUTION_TIME=${TRACER_MINIMUM_EXECUTION_TIME:-1}
+      - CACHE_EVENTS=${CACHE_EVENTS:-/caching-approaches-comparison/applications/output/azkaban-aplcache-cache}
+      - CACHE_REGISTER_SIZE=false
+      - APLCACHE_CACHEABLE_PARAMETERS=/caching-approaches-comparison/applications/output/aplcache-azkaban-parameters.json
       - TRACER_SERIALISE_INTERNALS=false
-      - TRACER_VERBOSE=true
-      - TRACER_TRACES=/caching-approaches-comparison/applications/traces/azkaban
       - TRACER_IGNORED_PACKAGES=/caching-approaches-comparison/applications/uncached/azkaban/ignored
-      - TRACER_WHITELIST=/caching-approaches-comparison/applications/uncached/azkaban/whitelist
-      - TRACER_LOG=/caching-approaches-comparison/applications/output/azkaban-tracer.log
     volumes:
       - application:/application
       - /root/.gradle:/home/gradle/.gradle