Fix memory leak in Dropwizard metrics: use sliding window reservoir

Change-Id: Ibd76338d8e88bfc0745dd397861b6655430ddeb0
(cherry picked from commit 5c4c410b2a08d19d05885ba8645723e98a2c64b4)
diff --git a/utils/misc/src/main/java/org/onlab/metrics/MetricsManager.java b/utils/misc/src/main/java/org/onlab/metrics/MetricsManager.java
index 7b9df98..dacd310 100644
--- a/utils/misc/src/main/java/org/onlab/metrics/MetricsManager.java
+++ b/utils/misc/src/main/java/org/onlab/metrics/MetricsManager.java
@@ -22,6 +22,7 @@
 import com.codahale.metrics.Metric;
 import com.codahale.metrics.MetricFilter;
 import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.SlidingWindowReservoir;
 import com.codahale.metrics.Timer;
 import com.google.common.collect.Sets;
 
@@ -180,7 +181,17 @@
                              final MetricsFeature feature,
                              final String metricName) {
         final String name = generateName(component, feature, metricName);
-        return metricsRegistry.timer(name);
+        Timer timer = metricsRegistry.getTimers().get(name);
+        if (timer != null) {
+            return timer;
+        }
+
+        timer = new Timer(new SlidingWindowReservoir(1028));
+        try {
+            return metricsRegistry.register(name, timer);
+        } catch (IllegalArgumentException e) {
+            return metricsRegistry.timer(name);
+        }
     }
 
     /**