azkaban-memoizeit

Details

diff --git a/azkaban-common/src/main/java/azkaban/metric/AbstractMetric.java b/azkaban-common/src/main/java/azkaban/metric/AbstractMetric.java
index 755cd57..fcce205 100644
--- a/azkaban-common/src/main/java/azkaban/metric/AbstractMetric.java
+++ b/azkaban-common/src/main/java/azkaban/metric/AbstractMetric.java
@@ -22,7 +22,7 @@ import org.apache.log4j.Logger;
  * Abstract class for Metric
  * @param <T> Type of Value of a given metric
  */
-public abstract class AbstractMetric<T> implements IMetric<T> {
+public abstract class AbstractMetric<T> implements IMetric<T>, Cloneable{
   protected static final Logger logger = Logger.getLogger(MetricReportManager.class);
   protected String name;
   protected T value;
@@ -84,9 +84,11 @@ public abstract class AbstractMetric<T> implements IMetric<T> {
   public synchronized void notifyManager() {
     logger.debug(String.format("Notifying Manager for %s", this.getClass().getName()));
     try {
-      metricManager.reportMetric(this);
+      metricManager.reportMetric( (IMetric<?>) this.clone());
     } catch (NullPointerException ex) {
       logger.error(String.format("Metric Manager is not set for %s metric %s", this.getClass().getName(), ex.toString()));
+    } catch (CloneNotSupportedException ex) {
+      logger.error(String.format("Failed to take snapshot for %s metric %s", this.getClass().getName(), ex.toString()));
     }
   }
 }
diff --git a/azkaban-common/src/main/java/azkaban/metric/TimeBasedReportingMetric.java b/azkaban-common/src/main/java/azkaban/metric/TimeBasedReportingMetric.java
index db6db1b..69c23ec 100644
--- a/azkaban-common/src/main/java/azkaban/metric/TimeBasedReportingMetric.java
+++ b/azkaban-common/src/main/java/azkaban/metric/TimeBasedReportingMetric.java
@@ -45,12 +45,15 @@ public abstract class TimeBasedReportingMetric<T> extends AbstractMetric<T> {
    * @return An anonymous TimerTask class
    */
   private TimerTask getTimerTask() {
+    final TimeBasedReportingMetric<T> lockObject = this;
     TimerTask recurringReporting = new TimerTask() {
       @Override
       public void run() {
-        preTrackingEventMethod();
-        notifyManager();
-        postTrackingEventMethod();
+        synchronized (lockObject) {
+          preTrackingEventMethod();
+          notifyManager();
+          postTrackingEventMethod();
+        }
       }
     };
     return recurringReporting;