azkaban-aplcache
Changes
azkaban-common/build.gradle 6(+0 -6)
azkaban-exec-server/build.gradle 6(+0 -6)
build.gradle 2(+2 -0)
docker-compose.yml 9(+3 -6)
Details
azkaban-common/build.gradle 6(+0 -6)
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);
}
}
azkaban-exec-server/build.gradle 6(+0 -6)
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
docker-compose.yml 9(+3 -6)
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