Work toward fixing ONOS-1031: Moved file PerformanceMonitor.java from
directory ofcontroller/flowmanager to ofcontroller/util
No functional changes.
Change-Id: Idfe4460487cb035c8a16c3c3ae20d38bead76846
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
index fd1a8b1..4c2bdf8 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEventHandler.java
@@ -34,6 +34,7 @@
import net.onrc.onos.ofcontroller.util.FlowPath;
import net.onrc.onos.ofcontroller.util.FlowPathUserState;
import net.onrc.onos.ofcontroller.util.Pair;
+import net.onrc.onos.ofcontroller.util.PerformanceMonitor;
import net.onrc.onos.ofcontroller.util.Port;
import net.onrc.onos.ofcontroller.util.serializers.KryoFactory;
import net.onrc.onos.registry.controller.IControllerRegistryService;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
index 353997b..55266b3 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
@@ -37,6 +37,7 @@
import net.onrc.onos.ofcontroller.util.FlowPath;
import net.onrc.onos.ofcontroller.util.FlowPathUserState;
import net.onrc.onos.ofcontroller.util.Pair;
+import net.onrc.onos.ofcontroller.util.PerformanceMonitor;
import net.onrc.onos.ofcontroller.util.serializers.KryoFactory;
import net.onrc.onos.registry.controller.IControllerRegistryService;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
index e9cafee..b5fd95d 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
@@ -23,6 +23,7 @@
import net.onrc.onos.ofcontroller.util.FlowEntrySwitchState;
import net.onrc.onos.ofcontroller.util.FlowId;
import net.onrc.onos.ofcontroller.util.FlowPath;
+import net.onrc.onos.ofcontroller.util.PerformanceMonitor;
import net.onrc.onos.ofcontroller.util.serializers.KryoFactory;
import com.esotericsoftware.kryo.Kryo;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
deleted file mode 100644
index 15e5cdc..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
+++ /dev/null
@@ -1,292 +0,0 @@
-package net.onrc.onos.ofcontroller.flowmanager;
-
-import java.util.Map.Entry;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Class for collecting performance measurements
- */
-public class PerformanceMonitor {
- private final static Logger log = LoggerFactory.getLogger(PerformanceMonitor.class);
-
- // experiment name -> PerformanceMonitor
- private static final ConcurrentHashMap<String,PerformanceMonitor> perfMons = new ConcurrentHashMap<>();
- public static PerformanceMonitor experiment(String name) {
- PerformanceMonitor pm = perfMons.get(name);
- if (pm == null) {
- pm = new PerformanceMonitor();
- PerformanceMonitor existing = perfMons.putIfAbsent(name, pm);
- if (existing != null) {
- pm = existing;
- }
- }
- return pm;
- }
-
- // tag -> Measurements
- private final ConcurrentHashMap<String, Queue<Measurement>> map = new ConcurrentHashMap<>();
- private long overhead;
- private long experimentStart = Long.MAX_VALUE;
- private final static double normalization = Math.pow(10, 6);
-
- /**
- * Start a performance measurement, identified by a tag
- *
- * Note: Only a single measurement can use the same tag at a time.
- * ..... not true anymore.
- *
- * @param tag for performance measurement
- */
- public Measurement startStep(String tag) {
- long start = System.nanoTime();
- if(start < experimentStart) {
- experimentStart = start;
- }
- Queue<Measurement> list = map.get(tag);
- if(list == null) {
- list = new ConcurrentLinkedQueue<Measurement>();
- Queue<Measurement> existing_list = map.putIfAbsent(tag, list);
- if (existing_list != null) {
- // someone concurrently added, using theirs
- list = existing_list;
- }
- }
- Measurement m = new Measurement();
- list.add(m);
- m.start();
- overhead += System.nanoTime() - start;
- return m;
- }
-
- /**
- * Stop a performance measurement.
- *
- * You must have already started a measurement with tag.
- *
- * @param tag for performance measurement
- */
- public void stopStep(String tag) {
- long time = System.nanoTime();
- Queue<Measurement> list = map.get(tag);
- if(list == null || list.size() == 0) {
- log.error("Tag {} does not exist", tag);
- }
- list.peek().stop(time);
- if(list.size() > 1) {
- log.error("Tag {} has multiple measurements", tag);
- }
- overhead += System.nanoTime() - time;
- }
-
- /**
- * Clear all performance measurements.
- */
- public void reset() {
- map.clear();
- overhead = 0;
- experimentStart = Long.MAX_VALUE;
- }
-
- /**
- * Write all performance measurements to the log
- */
- public void reportAll() {
- String result = "Performance Results: (avg/start/stop/count)\n";
- if(map.size() == 0) {
- result += "No Measurements";
- log.error(result);
- return;
- }
- long experimentEnd = -1;
- for(Entry<String, Queue<Measurement>> e : map.entrySet()) {
- String key = e.getKey();
- Queue<Measurement> list = e.getValue();
- long total = 0, count = 0;
- long start = Long.MAX_VALUE, stop = -1;
- for(Measurement m : list) {
- if(m.stop < 0) {
- continue; // measurement has not been stopped
- }
- // Collect overall start and end times
- if(m.start < start) {
- start = m.start;
- }
- if(m.stop > stop) {
- stop = m.stop;
- if(stop > experimentEnd) {
- experimentEnd = stop;
- }
- }
- // Collect statistics for average
- total += m.elapsed();
- count++;
- }
- double avg = (double) total / count;
- // Normalize start/stop
- start -= experimentStart;
- stop -= experimentStart;
- result += key + '=' +
- (avg / normalization) + '/' +
- (start / normalization) + '/' +
- (stop / normalization) + '/' +
- count + '\n';
- }
- double overheadMs = overhead / normalization;
- double experimentElapsed = (experimentEnd - experimentStart) / normalization;
- result += "TotalTime:" + experimentElapsed + "/Overhead:" + overheadMs;
- log.error(result);
-// log.error("Performance Results: {} with measurement overhead: {} ms", map, overheadMilli);
- }
-
- /**
- * Write the performance measurement for a tag to the log
- *
- * @param tag the tag name.
- */
- public void reportStep(String tag) {
- Queue<Measurement> list = map.get(tag);
- if(list == null) {
- return; //TODO
- }
- //TODO: fix this;
- Measurement m = list.peek();
- if (m != null) {
- log.error("Performance Result: tag = {} start = {} stop = {} elapsed = {}",
- tag, m.start, m.stop, m.toString());
- } else {
- log.error("Performance Result: unknown tag {}", tag);
- }
- }
-
- /**
- * A single performance measurement
- */
- public static class Measurement {
- long start;
- long stop = -1;
-
- /**
- * Start the measurement
- */
- public void start() {
- if(start <= 0) {
- start = System.nanoTime();
- }
- }
-
- /**
- * Stop the measurement
- */
- public void stop() {
- long now = System.nanoTime();
- stop(now);
- }
-
- /**
- * Stop the measurement at a specific time
- * @param time to stop
- */
- public void stop(long time){
- if(stop <= 0) {
- stop = time;
- }
- }
-
- /**
- * Compute the elapsed time of the measurement in nanoseconds
- *
- * @return the measurement time in nanoseconds, or -1 if the measurement is stil running.
- */
- public long elapsed() {
- if(stop <= 0) {
- return -1;
- }
- else {
- return stop - start;
- }
- }
-
- /**
- * Returns the number of milliseconds for the measurement as a String.
- */
- @Override
- public String toString() {
- double milli = elapsed() / normalization;
- double startMs = start / normalization;
- double stopMs = stop / normalization;
-
- return milli + "ms/" + startMs + '/' + stopMs;
- }
- }
-
- @Deprecated
- private static final PerformanceMonitor theInstance = new PerformanceMonitor();
-
- @Deprecated
- public static Measurement start(String tag) {
- return theInstance.startStep(tag);
- }
-
- @Deprecated
- public static void stop(String tag) {
- theInstance.stopStep(tag);;
- }
-
- @Deprecated
- public static void clear() {
- theInstance.reset();;
- }
-
- @Deprecated
- public static void report() {
- theInstance.reportAll();;
- }
-
- @Deprecated
- public static void report(String tag) {
- theInstance.reportStep(tag);
- }
-
- public static void main(String args[]){
- // test the measurement overhead
- String tag;
- for(int i = 0; i < 2; i++){
- tag = "foo foo foo";
- Measurement m;
- m = start(tag); System.out.println(tag); m.stop();
- m = start(tag); System.out.println(tag); m.stop();
- m = start(tag); System.out.println(tag); m.stop();
- m = start(tag); System.out.println(tag); m.stop();
- tag = "bar";
- start(tag); stop(tag);
- tag = "baz";
- start(tag); stop(tag);
- report();
- clear();
- }
- for(int i = 0; i < 100; i++){
- tag = "a";
- start(tag); stop(tag);
- start(tag); stop(tag);
-
- start(tag); stop(tag);
- start(tag); stop(tag);
- start(tag); stop(tag);
- start(tag); stop(tag);
- start(tag); stop(tag);
- start(tag); stop(tag);
-
- tag = "b";
- start(tag); stop(tag);
- tag = "c";
- start(tag); stop(tag);
- report();
- clear();
- }
- }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetFlowByIdResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetFlowByIdResource.java
index de625d7..1cbeece 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetFlowByIdResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/web/GetFlowByIdResource.java
@@ -1,7 +1,6 @@
package net.onrc.onos.ofcontroller.flowmanager.web;
import net.onrc.onos.ofcontroller.flowmanager.IFlowService;
-import net.onrc.onos.ofcontroller.flowmanager.PerformanceMonitor;
import net.onrc.onos.ofcontroller.util.FlowId;
import net.onrc.onos.ofcontroller.util.FlowPath;