adding measurements to PlanInstallRuntime
Change-Id: I7d9fa35be9ef1611f18b33d8b79de21145c227ab
diff --git a/src/main/java/net/onrc/onos/intent/runtime/PlanInstallRuntime.java b/src/main/java/net/onrc/onos/intent/runtime/PlanInstallRuntime.java
index abd82ed..e8d498f 100644
--- a/src/main/java/net/onrc/onos/intent/runtime/PlanInstallRuntime.java
+++ b/src/main/java/net/onrc/onos/intent/runtime/PlanInstallRuntime.java
@@ -1,6 +1,7 @@
package net.onrc.onos.intent.runtime;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -38,15 +39,73 @@
this.provider = provider;
this.pusher = pusher;
}
+
+ private static class FlowModCount {
+ IOFSwitch sw;
+ long modFlows = 0;
+ long delFlows = 0;
+ long errors = 0;
+
+ FlowModCount(IOFSwitch sw) {
+ this.sw = sw;
+ }
+
+ void addFlowEntry(FlowEntry entry) {
+ switch(entry.getOperator()){
+ case ADD:
+ modFlows++;
+ break;
+ case ERROR:
+ errors++;
+ break;
+ case REMOVE:
+ delFlows++;
+ break;
+ default:
+ break;
+ }
+ }
+
+ public String toString() {
+ return "sw:" + sw.getStringId() + ": modify " + modFlows + " delete " + delFlows + " error " + errors;
+ }
+
+ static Map<IOFSwitch, FlowModCount> map = new HashMap<>();
+ static void countFlowEntry(IOFSwitch sw, FlowEntry entry) {
+ FlowModCount count = map.get(sw);
+ if(count == null) {
+ count = new FlowModCount(sw);
+ map.put(sw, count);
+ }
+ count.addFlowEntry(entry);
+ }
+ static void startCount() {
+ map.clear();
+ }
+ static void printCount() {
+ String result = "FLOWMOD COUNT:\n";
+ for(FlowModCount count : map.values()) {
+ result += count.toString() + '\n';
+ }
+ if(map.values().isEmpty()) {
+ result += "No flow mods installed\n";
+ }
+ log.error(result);
+ }
+ }
public boolean installPlan(List<Set<FlowEntry>> plan) {
long start = System.nanoTime();
Map<Long,IOFSwitch> switches = provider.getSwitches();
+
log.debug("IOFSwitches: {}", switches);
+
+ FlowModCount.startCount();
for(Set<FlowEntry> phase : plan) {
Set<Pair<IOFSwitch, net.onrc.onos.ofcontroller.util.FlowEntry>> entries = new HashSet<>();
Set<IOFSwitch> modifiedSwitches = new HashSet<>();
-
+
+ long step1 = System.nanoTime();
// convert flow entries and create pairs
for(FlowEntry entry : phase) {
IOFSwitch sw = switches.get(entry.getSwitch());
@@ -55,13 +114,16 @@
log.debug("Skipping flow entry: {}", entry);
continue;
}
- entries.add(new Pair<>(sw, entry.getFlowEntry()));
+ entries.add(new Pair<>(sw, entry.getFlowEntry()));
modifiedSwitches.add(sw);
+ FlowModCount.countFlowEntry(sw, entry);
}
+ long step2 = System.nanoTime();
// push flow entries to switches
log.debug("Pushing flow entries: {}", entries);
pusher.pushFlowEntries(entries);
+ long step3 = System.nanoTime();
// TODO: insert a barrier after each phase on each modifiedSwitch
// TODO: wait for confirmation messages before proceeding
@@ -78,9 +140,14 @@
log.error("Barrier message not received for sw: {}", sw);
}
}
+ long step4 = System.nanoTime();
+ log.error("MEASUREMENT: convert: {} ns, push: {} ns, barrierWait: {} ns",
+ step2 - step1, step3 - step2, step4 - step3);
+
}
long end = System.nanoTime();
log.error("MEASUREMENT: Install plan: {} ns", (end-start));
+ FlowModCount.printCount();
// TODO: we assume that the plan installation succeeds for now
return true;