adaptive-caching-framework
Changes
evaluation/Applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java 5(+2 -3)
evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java 4(+1 -3)
evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java 5(+2 -3)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java 38(+34 -4)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/stats/CacheabilityMetrics.java 14(+8 -6)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java 39(+18 -21)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java 4(+2 -2)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/interfaces/Trigger.java 1(+1 -0)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java 13(+4 -9)
framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/LogTrace.java 6(+1 -5)
Details
diff --git a/evaluation/Applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java b/evaluation/Applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java
index d5c8885..fc0a6c5 100644
--- a/evaluation/Applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java
+++ b/evaluation/Applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java
@@ -6,10 +6,9 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Cache
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Modelling;
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.RepositoryType;
-//working config: memory, fullexploration
@AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MEMORY,
modelling = Modelling.FULLEXPLORATION, analyzerEnabled = true, enabled = true, disableMonitoringAfterAnalysis = true,
- clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true, analyzeOnce = true)
-@ComponentScan(allowed = "eu.cloudscale.showcase", denied = "eu.cloudscale.showcase.db.model")
+ clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true, analyzeOnce = true, expiryInterval = 86400)
+@ComponentScan(allowed = "eu.cloudscale.showcase", denied = {"eu.cloudscale.showcase.db.model", "eu.cloudscale.showcase.servlets", "eu.cloudscale.showcase.db.dao.hibernate"})
public class Configuration {
}
diff --git a/evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java b/evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
index 70bb622..9ca4a91 100644
--- a/evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
+++ b/evaluation/Applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
@@ -6,10 +6,8 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Cache
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Modelling;
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.RepositoryType;
-//working config: mongo, full exploration
@AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MEMORY,
- modelling = Modelling.FULLEXPLORATION, analyzerEnabled = true, enabled = true, disableMonitoringAfterAnalysis = true,
- clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true)
+ modelling = Modelling.FULLEXPLORATION, analyzerEnabled = true, enabled = true, disableMonitoringAfterAnalysis = true, traceAsync = false, tracerEnabled = true)
@ComponentScan(allowed = "com.salesmanager", denied = "model")
public class Configuration {
}
diff --git a/evaluation/Applications/AP/spring-petclinic/pom.xml b/evaluation/Applications/AP/spring-petclinic/pom.xml
index 18e70c8..06460d6 100644
--- a/evaluation/Applications/AP/spring-petclinic/pom.xml
+++ b/evaluation/Applications/AP/spring-petclinic/pom.xml
@@ -126,15 +126,15 @@
<artifactId>spring-oxm</artifactId>
</dependency>
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjrt</artifactId>
- </dependency>
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- <scope>runtime</scope>
- </dependency>
+ <!--<dependency>-->
+ <!--<groupId>org.aspectj</groupId>-->
+ <!--<artifactId>aspectjrt</artifactId>-->
+ <!--</dependency>-->
+ <!--<dependency>-->
+ <!--<groupId>org.aspectj</groupId>-->
+ <!--<artifactId>aspectjweaver</artifactId>-->
+ <!--<scope>runtime</scope>-->
+ <!--</dependency>-->
<!-- Database connection pool
See here for more details on commons-dbcp versus tomcat-jdbc:
@@ -231,11 +231,6 @@
<artifactId>autonomicmanager</artifactId>
<version>0.5.0-SNAPSHOT</version>
</dependency>
- <dependency>
- <groupId>org.mongodb</groupId>
- <artifactId>mongo-java-driver</artifactId>
- <version>[3.2.2]</version>
- </dependency>
</dependencies>
<!-- Maven plugin versions are mentioned in order to guarantee the build reproducibility in the long term -->
@@ -302,7 +297,6 @@
<version>2.2</version>
<configuration>
<server>tomcat-development-server</server>
- <port>9966</port>
<path>/petclinic</path>
<systemProperties>
<JAVA_OPTS>-Xms1024m -Xmx2048m</JAVA_OPTS>
@@ -353,7 +347,7 @@
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
- <version>1.8.10</version>
+ <version>1.8.9</version>
</dependency>
</dependencies>
</plugin>
diff --git a/evaluation/Applications/AP/spring-petclinic/spring-petclinic.iml b/evaluation/Applications/AP/spring-petclinic/spring-petclinic.iml
index 0eeb2c9..a14afec 100644
--- a/evaluation/Applications/AP/spring-petclinic/spring-petclinic.iml
+++ b/evaluation/Applications/AP/spring-petclinic/spring-petclinic.iml
@@ -36,6 +36,7 @@
<orderEntry type="library" name="Maven: org.springframework:spring-tx:4.2.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:4.2.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:4.2.8.RELEASE" level="project" />
+ <orderEntry type="library" name="Maven: org.aspectj:aspectjrt:1.8.9" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:jcl-over-slf4j:1.7.21" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-jdbc-core:1.1.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.1.3.RELEASE" level="project" />
@@ -45,8 +46,6 @@
<orderEntry type="library" name="Maven: org.springframework:spring-web:4.2.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:4.2.8.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:4.2.8.RELEASE" level="project" />
- <orderEntry type="library" name="Maven: org.aspectj:aspectjrt:1.8.9" level="project" />
- <orderEntry type="library" scope="RUNTIME" name="Maven: org.aspectj:aspectjweaver:1.8.9" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.tomcat:tomcat-jdbc:8.0.37" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.tomcat:tomcat-juli:8.0.37" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.21" level="project" />
@@ -82,9 +81,11 @@
<orderEntry type="library" name="Maven: br.ufrgs.inf.prosoft.adaptivecaching:autonomicmanager:0.5.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
+ <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.8.9" level="project" />
<orderEntry type="library" name="Maven: org.ehcache:sizeof:0.3.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.3.2" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-hibernate4:2.6.7" level="project" />
+ <orderEntry type="library" name="Maven: org.mongodb:mongo-java-driver:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.redisson:redisson:3.1.0" level="project" />
<orderEntry type="library" name="Maven: javax.cache:cache-api:1.0.0" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.0.42.Final" level="project" />
@@ -110,7 +111,6 @@
<orderEntry type="library" name="Maven: com.esotericsoftware:reflectasm:1.10.1" level="project" />
<orderEntry type="library" name="Maven: org.ow2.asm:asm:5.0.3" level="project" />
<orderEntry type="library" name="Maven: com.esotericsoftware:minlog:1.3.0" level="project" />
- <orderEntry type="library" name="Maven: org.mongodb:mongo-java-driver:3.2.2" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: mysql:mysql-connector-java:5.1.36" level="project" />
</component>
</module>
\ No newline at end of file
diff --git a/evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java b/evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
index 9da18c7..082f6a4 100644
--- a/evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
+++ b/evaluation/Applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
@@ -6,10 +6,9 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Cache
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Modelling;
import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.RepositoryType;
-//working config: mongodb, accumulation
@AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MEMORY,
- modelling = Modelling.ACCUMULATION, analyzerEnabled = false, enabled = true, disableMonitoringAfterAnalysis = true,
- clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true)
+ modelling = Modelling.FULLEXPLORATION, analyzerEnabled = true, enabled = true, disableMonitoringAfterAnalysis = true,
+ clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true, analyzeOnce = true, expiryInterval = 60)
//Jhonny: workaround below. a better solution involve filter by serialization methods in aspect to avoid it
@ComponentScan(allowed = "org.springframework.samples.petclinic", denied = "org.springframework.samples.petclinic.model")
diff --git a/evaluation/Applications/DEV/spring-petclinic/pom.xml b/evaluation/Applications/DEV/spring-petclinic/pom.xml
index 6fc28c4..f641aaf 100644
--- a/evaluation/Applications/DEV/spring-petclinic/pom.xml
+++ b/evaluation/Applications/DEV/spring-petclinic/pom.xml
@@ -282,7 +282,6 @@
<version>2.2</version>
<configuration>
<server>tomcat-development-server</server>
- <port>9966</port>
<path>/petclinic</path>
<systemProperties>
<JAVA_OPTS>-Xms1024m -Xmx2048m</JAVA_OPTS>
diff --git a/evaluation/Applications/NO/spring-petclinic/pom.xml b/evaluation/Applications/NO/spring-petclinic/pom.xml
index fbe37fd..2b0e77a 100644
--- a/evaluation/Applications/NO/spring-petclinic/pom.xml
+++ b/evaluation/Applications/NO/spring-petclinic/pom.xml
@@ -282,7 +282,6 @@
<version>2.2</version>
<configuration>
<server>tomcat-development-server</server>
- <port>9966</port>
<path>/petclinic</path>
<systemProperties>
<JAVA_OPTS>-Xms1024m -Xmx2048m</JAVA_OPTS>
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java
index cb2422b..da570b7 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/FlowchartWorkFlow.java
@@ -9,6 +9,7 @@ import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.aspects.Trace
import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.LogTrace;
import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata.MethodInfo;
import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.cache.CacheInfo;
+import org.apache.commons.lang3.builder.EqualsBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,10 +34,12 @@ public class FlowchartWorkFlow implements Processer {
private double sumHitRatio;
private double sumExecutionTime;
private double sumShareability;
+ private double sumFrequency;
private List<Double> hitRatios = new ArrayList<>();
private List<Double> missRatios = new ArrayList<>();
private List<Long> executionTimes = new ArrayList<>();
private List<Double> shareabilities = new ArrayList<>();
+ private List<Long> frequencies = new ArrayList<>();
public FlowchartWorkFlow(CacheDecider decider, CacheInfo cacheInfo, List<LogTrace> logList) {
this.decider = decider;
@@ -63,6 +66,7 @@ public class FlowchartWorkFlow implements Processer {
logger.debug("StdDv HitRatio: " + getStdDevHitRatio());
logger.debug("StdDv MissRatio: " + getStdDevMissRatio());
logger.debug("StdDv shareability: " + getStdDevShareability());
+ logger.debug("StdDv frequency: " + getStdDevFrequency());
int k = 0;
logger.debug("Using " + k + " stdDev to calculate thresholds...");
@@ -70,6 +74,7 @@ public class FlowchartWorkFlow implements Processer {
logger.debug("Threshold HitRatio: " + hitThreshold(k));
logger.debug("Threshold MissRatio: " + missThreshold(k));
logger.debug("Threshold Shareability: " + shareabilityThreshold(k));
+ logger.debug("Threshold frequency: " + frequencyThreshold(k));
}
@@ -124,31 +129,36 @@ public class FlowchartWorkFlow implements Processer {
sumHitRatio = 0;
sumMissRatio = 0;
sumShareability = 0;
+ sumFrequency = 0;
+
HashMap<MethodInfo, MethodStats> methodInfoMap = new HashMap<>();
for (int i = 0; i < logs.size(); i++) {
LogTrace logTrace = logs.get(i);
- if (methodInfoMap.get(logTrace.getMethodInfo()) != null)
+ if (methodInfoMap.containsKey(logTrace.getMethodInfo()))
continue;
MethodStats methodStats = new MethodStats(logTrace);
- for (int j = i + 1; j < logs.size(); j++) {
+ for (int j = 0; j < logs.size(); j++) {
LogTrace traceCompare = logs.get(j);
+ if(i == j)
+ continue;
+
//if similar methods: same signature and params, different return
// if(logTrace.getMethodInfo().getHashedArguments())
-
if (traceCompare.getMethodInfo().equalsWithoutReturnedValue(logTrace.getMethodInfo())
// || traceCompare.getMethodInfo().equalsHashedWithoutReturnedValue(logTrace.getMethodInfo())
) {
//if identical methods
- if (Objects.deepEquals(traceCompare.getMethodInfo().getReturnedValue(), logTrace.getMethodInfo().getReturnedValue())
+ if (EqualsBuilder.reflectionEquals(traceCompare.getMethodInfo().getReturnedValue(), logTrace.getMethodInfo().getReturnedValue())
// || Objects.equals(traceCompare.getMethodInfo().getHashedReturnedValue(), logTrace.getMethodInfo().getHashedReturnedValue())
)
methodStats.addSameOccurrence(traceCompare);
+
else methodStats.addDifferentReturnOccurrence();
}
}
@@ -166,6 +176,9 @@ public class FlowchartWorkFlow implements Processer {
sumShareability += methodStats.shareability();
shareabilities.add(methodStats.shareability());
+
+ sumFrequency += methodStats.getNumberOfSameOccurrences();
+ frequencies.add(methodStats.getNumberOfSameOccurrences());
}
return methodInfoMap;
@@ -219,6 +232,15 @@ public class FlowchartWorkFlow implements Processer {
return Math.sqrt(temp / population);
}
+ public double getStdDevFrequency() {
+ //todo salvar em mémoria e não ficar recalculando
+ double mean = getAverageFrequency();
+ double temp = 0;
+ for (Long a : frequencies)
+ temp += (a - mean) * (a - mean);
+ return Math.sqrt(temp / population);
+ }
+
public double getStdDevShareability() {
//todo salvar em mémoria e não ficar recalculando
double mean = getAverageShareability();
@@ -251,6 +273,11 @@ public class FlowchartWorkFlow implements Processer {
return getAverageShareability() + (kStdDev * getStdDevShareability());
}
+ //getting X% most frenquent
+ public double frequencyThreshold(int kStdDev) {
+ return getAverageFrequency() + (kStdDev * getStdDevFrequency());
+ }
+
/**
* General miss ratio from a signature
*
@@ -287,4 +314,7 @@ public class FlowchartWorkFlow implements Processer {
return occurrences / methods;
}
+ public double getAverageFrequency() {
+ return new BigDecimal(sumFrequency).divide(new BigDecimal(frequencies.size()), 5, RoundingMode.HALF_UP).doubleValue();
+ }
}
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/stats/CacheabilityMetrics.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/stats/CacheabilityMetrics.java
index 2fe1e85..d873dd8 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/stats/CacheabilityMetrics.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/analysis/decision/flowchart/stats/CacheabilityMetrics.java
@@ -32,7 +32,6 @@ public class CacheabilityMetrics {
long n = (long) ((N * Math.pow(Z, 2) * p * (1 - p)) /
((N - 1) * Math.pow(e, 2) + Math.pow(Z, 2) * p * (1 - p)));
-
//simplified without the population
//int nn = (int) ((Math.pow(Z,2) * p * (1-p)) / Math.pow(e,2));
return n;
@@ -41,11 +40,13 @@ public class CacheabilityMetrics {
public static Optional<Boolean> isStaticData(MethodStats methodStats, FlowchartWorkFlow workflow, int population) {
//executions of a method should represent a good portion of total logs in order to avoid 1 occur == 100% hit
- if (!(methodStats.getNumberOfSameOccurrences() >= sampleSize(methodStats.getNumberOfOccurrences(), 1.645, 0.05)
- && methodStats.getNumberOfOccurrences() >= sampleSize(population, 1.645, 0.05))) {
+// if (!(methodStats.getNumberOfSameOccurrences() >= sampleSize(methodStats.getNumberOfOccurrences(), 1.645, 0.05)
+// && methodStats.getNumberOfOccurrences() >= sampleSize(population, 1.645, 0.05))) {
+// return Optional.empty();
+// }
+ if (methodStats.getNumberOfSameOccurrences() < workflow.frequencyThreshold(0)) {
return Optional.empty();
}
-
if (methodStats.hitRatio() == 100.0)
return Optional.of(true);
else
@@ -63,9 +64,10 @@ public class CacheabilityMetrics {
public static Optional<Boolean> usedByManyRequests(MethodStats methodStats, FlowchartWorkFlow workflow, int population) {
//same executions of a method should represent a good portion of total execution of such method
- if (methodStats.getNumberOfOccurrences() >= sampleSize(population, 2.575, 0.03)) {
+ if (methodStats.getNumberOfSameOccurrences() >= workflow.frequencyThreshold(0)) {
+// if (methodStats.getNumberOfOccurrences() >= sampleSize(population, 1.645, 0.05)) {
return Optional.of(true);
- } else return Optional.empty();
+ } else return Optional.of(false);
}
public static Optional<Boolean> isUserSpecific(MethodStats methodStats, FlowchartWorkFlow workflow) {
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java
index 9968d91..5b26f03 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/cachemanager/cacher/key/Key.java
@@ -9,24 +9,13 @@ import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicInteger;
/**
* Key of a callable target.
- *
- * @checkstyle DesignForExtensionCheck (2 lines)
*/
public class Key {
/**
- * When instantiated.
- */
- private final transient long start;
- /**
- * How many times the key was already accessed.
- */
- private final transient AtomicInteger accessed;
- /**
* MethodInfo.
*/
private final transient Method method;
@@ -52,8 +41,6 @@ public class Key {
* @param point Joint point
*/
public Key(final JoinPoint point) {
- this.start = System.currentTimeMillis();
- this.accessed = new AtomicInteger();
this.method = MethodSignature.class
.cast(point.getSignature()).getMethod();
this.target = Key.targetize(point);
@@ -99,9 +86,7 @@ public class Key {
@Override
public String toString() {
return "Key{" +
- "start=" + start +
- ", accessed=" + accessed +
- ", method=" + method +
+ "method=" + method +
", target=" + target +
", arguments=" + Arrays.toString(arguments) +
'}';
@@ -113,14 +98,29 @@ public class Key {
}
@Override
+// public final boolean equals(final Object obj) {
+// final boolean equals;
+// if (this == obj) {
+// equals = true;
+// } else if (obj instanceof Key) {
+// final Key key = Key.class.cast(obj);
+// equals = key.method.equals(this.method)
+// && this.target.equals(key.target)
+// && Arrays.deepEquals(key.arguments, this.arguments);
+// } else {
+// equals = false;
+// }
+// return equals;
+// }
public final boolean equals(final Object obj) {
+
final boolean equals;
if (this == obj) {
equals = true;
} else if (obj instanceof Key) {
final Key key = Key.class.cast(obj);
equals = key.method.equals(this.method)
- && this.target.equals(key.target)
+ //&& this.target.equals(key.target)
&& Arrays.deepEquals(key.arguments, this.arguments);
} else {
equals = false;
@@ -136,15 +136,12 @@ public class Key {
* @checkstyle DesignForExtensionCheck (2 lines)
*/
public Object through(final Object result) {
- final int hit = this.accessed.getAndIncrement();
final Class<?> type = this.method.getDeclaringClass();
// if (hit > 0 && LogHelper.enabled(this.level, type)) {
logger.debug(
"%s: %s from model (hit #%d, %[ms]s old)",
this,
- Mnemos.toText(result, true, false),
- hit,
- System.currentTimeMillis() - this.start
+ Mnemos.toText(result, true, false)
);
// }
return result;
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java
index 186428d..339e18a 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/annotation/AdaptiveCaching.java
@@ -24,7 +24,7 @@ public @interface AdaptiveCaching {
Modelling modelling() default Modelling.ACCUMULATION;
long expiryInterval() default 300000; //5 minutes
- long firstExpiry() default 300000; //5 minutes
+ @Deprecated long firstExpiry() default 300000; //5 minutes
//todo when analysis based on trigger do not make sense to have this, its similar to trigger by time
@Deprecated long analysisInterval() default 300000; //5 minutes
@@ -32,7 +32,7 @@ public @interface AdaptiveCaching {
TriggerType triggerType() default TriggerType.TIME; //if were not by time, load the class that implements the interface @Trigger
- long triggerTime() default 300000; //in minutes
+ long triggerTime() default 300000; //5 minutes
//enables the analyzer to be executed just once
boolean analyzeOnce() default false;
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/interfaces/Trigger.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/interfaces/Trigger.java
index 92c8a02..256e95a 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/interfaces/Trigger.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/configuration/interfaces/Trigger.java
@@ -1,4 +1,5 @@
package br.ufrgs.inf.prosoft.adaptivecaching.configuration.interfaces;
+//TODO
public interface Trigger {
}
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
index 877c53b..4e495e0 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
@@ -244,14 +244,12 @@ public class TracerAspect {
if(!isAllowed(joinPoint))
return joinPoint.proceed();
- Key key = null;
+ //generate a hash of the method that will be used as: key to cache and compare if the method is allowed or not
+ Key key = new Key(joinPoint);
+ //when method is already cached and obtained from it, no trace will be generated
+ //System.out.println(key + "generated to " + joinPoint.getSignature().toLongString());
if(cacheableMethodKeys.contains(key)) {
- //generate a hash of the method that will be used as: key to cache and compare if the method is allowed or not
- key = new Key(joinPoint);
-
- //when method is already cached and obtained from it, no trace will be generated
- //System.out.println(key + "generated to " + joinPoint.getSignature().toLongString());
//System.out.println(key + "is a cacheable method");
return cache(key, joinPoint);
@@ -276,9 +274,6 @@ public class TracerAspect {
}
if (tracerEnabled) {
- if(key == null)
- key = new Key(joinPoint);
-
trace(key, joinPoint);
}
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/LogTrace.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/LogTrace.java
index 16aa09e..9426aa7 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/LogTrace.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/LogTrace.java
@@ -1,16 +1,12 @@
package br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata;
-public class LogTrace {
+public class LogTrace{
private MethodInfo methodInfo;
private long startTime;
private long endTime;
private String userId;
- public LogTrace() {
-
- }
-
public MethodInfo getMethodInfo() {
return this.methodInfo;
}
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
index 18c3c40..1d89e6e 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/metadata/MethodInfo.java
@@ -1,6 +1,7 @@
package br.ufrgs.inf.prosoft.adaptivecaching.monitoring.application.metadata;
import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.cacher.key.Key;
+import org.apache.commons.lang3.builder.EqualsBuilder;
import java.util.Objects;
@@ -65,28 +66,31 @@ public class MethodInfo {
}
public boolean equalsWithoutReturnedValue(Object o) {
+
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MethodInfo that = (MethodInfo) o;
- if (!signature.equals(that.signature)) return false;
- if (!Objects.deepEquals(arguments, that.arguments)) return false;
-// if (!arguments.equals(that.arguments)) return false;
+ if (!EqualsBuilder.reflectionEquals(signature,that.signature)) return false;
+ if (!(Objects.deepEquals(arguments, that.arguments) || EqualsBuilder.reflectionEquals(arguments, that.arguments))) return false;
+
return true;
+ //return EqualsBuilder.reflectionEquals(this, o, "returnedValue", "key");
}
@Override
public boolean equals(Object o) {
+// return EqualsBuilder.reflectionEquals(this, o, "key");
+
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MethodInfo that = (MethodInfo) o;
- if (!signature.equals(that.signature)) return false;
-// if (!arguments.equals(that.arguments)) return false;
- if (!Objects.deepEquals(arguments, that.arguments)) return false;
- return returnedValue != null ? Objects.deepEquals(returnedValue, that.returnedValue) : that.returnedValue == null;
+ if (!EqualsBuilder.reflectionEquals(signature,that.signature)) return false;
+ if (!EqualsBuilder.reflectionEquals(arguments, that.arguments)) return false;
+ return EqualsBuilder.reflectionEquals(returnedValue, that.returnedValue) || Objects.deepEquals(returnedValue, that.returnedValue);
}
// public boolean equalsHashed(Object o) {
@@ -129,10 +133,9 @@ public class MethodInfo {
@Override
public int hashCode() {
- int result = signature.hashCode();
- result = 31 * result + Objects.hash(arguments);
- result = 31 * result + (returnedValue != null ? Objects.hash(returnedValue) : 0);
- return result;
+ //TODO equals is enough to distinghish, not able to get a unique hashcode
+ return 1;
+ //return HashCodeBuilder.reflectionHashCode(this, "key");
}
public String toString() {
diff --git a/framework/autonomicmanager/src/main/resources/logback.xml b/framework/autonomicmanager/src/main/resources/logback.xml
index e7cfc5b..8a7283d 100644
--- a/framework/autonomicmanager/src/main/resources/logback.xml
+++ b/framework/autonomicmanager/src/main/resources/logback.xml
@@ -26,7 +26,7 @@
<!--<appender-ref ref="FILE" />-->
</logger>
- <logger name="br.ufrgs.inf.prosoft.adaptivecaching.analysis" level="info" additivity="false">
+ <logger name="br.ufrgs.inf.prosoft.adaptivecaching.analysis" level="debug" additivity="false">
<appender-ref ref="STDOUT" />
<!--<appender-ref ref="FILE" />-->
</logger>
@@ -43,7 +43,7 @@
<logger name="org.reflections.Reflections" level="INFO"/>
<!-- By default, the level of the root level is set to DEBUG -->
- <root level="info">
+ <root level="debug">
<appender-ref ref="STDOUT"/>
</root>