some fixes for performance measurments and added plot
diff --git a/perf-scripts/flow-manager-perf.py b/perf-scripts/flow-manager-perf.py
index 4ee6beb..9eb022e 100644
--- a/perf-scripts/flow-manager-perf.py
+++ b/perf-scripts/flow-manager-perf.py
@@ -28,7 +28,7 @@
 print "ONOS Log File:", ONOS_LOG
 
 PORT = 's1-eth2'
-N = 5
+N = 1
 
 # ----------------- Running the test and output  -------------------------
 
@@ -39,10 +39,11 @@
     self.onosTime = onosTime
     self.overhead = overhead
     # sorted by start time
-    self.details = sorted(details, key=lambda x: float(x[2]) )
+    self.tags = sorted(details, key=lambda x: float(x[2]))
+    self.details = sorted(details, key=lambda x: float(x[2]), reverse=True)
 
   def __repr__(self):
-    return '%f %f %f %d %s' % (self.tsharkTime, self.onosTime, self.overhead, self.flowmods, self.details)
+    return '%f %f %f %d %s' % (self.tsharkTime, self.onosTime, self.overhead, self.flowmods, self.tags)
 
 
 def clearResults():
@@ -85,6 +86,7 @@
       timeout = 3 #sec
   elapsed = (end - start) * 1000
 
+  sleep(2)
   # read the performance results from ONOS
   reportResults() # REST call
 
@@ -97,7 +99,7 @@
   result = Result(elapsed, count, totalTime, overhead, tags)
   # Output results
   print result
-
+  plot(result)
 
   # Bring port back up
   call( 'ifconfig %s up' % PORT, shell=True )
@@ -126,6 +128,88 @@
   totalTime = datetime.now() - start
   print '\nExperiments complete in %s (h:m:s.s)' % totalTime
 
+def plot(result):
+  import matplotlib.pyplot as plt
+  import pylab
+  import numpy as np
+  from matplotlib.ticker import MaxNLocator
+  
+  tags = [ x[0] for x in result.details ]
+  numTags = len(tags)
+  scores = [ float(x[1]) for x in result.details ]
+  offset = [ float(x[2]) for x in result.details ]
+  rankings = [ float(x[3]) - float(x[2]) for x in result.details ]
+  counts = [ x[4] for x in result.details ]
+  
+  fig, ax1 = plt.subplots(figsize=(15, 9))
+  plt.subplots_adjust(left=0.3, right=0.8)
+  pos = np.arange(numTags)+0.5    # Center bars on the Y-axis ticks
+  rects = ax1.barh(pos, rankings, left=offset, align='center', height=0.5, color='m')
+  
+  ax1.axis([0, result.onosTime, 0, numTags])
+  pylab.yticks(pos, tags)
+  ax1.set_title('TITLE HERE')
+  #plt.text(result.onosTime/2, -0.5, 
+  #         'Iteration: ' + str(1), horizontalalignment='center', size='small')
+  
+  # Set the right-hand Y-axis ticks and labels and set X-axis tick marks at the
+  # deciles
+  ax2 = ax1.twinx()
+  print MaxNLocator(7)
+  ax2.xaxis.set_major_locator(MaxNLocator(7)) # max number of xaxis ticks
+  #ax2.plot([100, 100], [0, 5], 'white', alpha=0.1)
+  ax2.xaxis.grid(True, linestyle='--', which='major', color='grey', alpha=0.25)
+  #Plot a solid vertical gridline to highlight the median position
+  #plt.plot([50, 50], [0, 5], 'grey', alpha=0.25)
+  
+  # Build up the score labels for the right Y-axis by first appending a carriage
+  # return to each string and then tacking on the appropriate meta information
+  # (i.e., 'laps' vs 'seconds'). We want the labels centered on the ticks, so if
+  # there is no meta info (like for pushups) then don't add the carriage return to
+  # the string
+  
+  '''
+  scoreLabels = [withnew(i, scr) for i, scr in enumerate(scores)]
+  scoreLabels = [i+j for i, j in zip(scoreLabels, testMeta)]
+  '''
+  scoreLabels = ['%.3f ms\n%s'%(i,j)  for i,j in zip(scores,counts)]
+  # set the tick locations
+  ax2.set_yticks(pos)
+  # set the tick labels
+  ax2.set_yticklabels(scoreLabels)
+  # make sure that the limits are set equally on both yaxis so the ticks line up
+  ax2.set_ylim(ax1.get_ylim())
+  
+  ax1.set_xlabel('Time (ms)') 
+  ax2.set_ylabel('Average iteration / Count')
+  
+  # Lastly, write in the ranking inside each bar to aid in interpretation
+  for rect in rects:
+      # Rectangle widths are already integer-valued but are floating
+      # type, so it helps to remove the trailing decimal point and 0 by
+      # converting width to int type
+      width = int(rect.get_width())
+      offset = int(rect.get_x())
+      percent = width / result.onosTime
+      onePercent = 0.01 * result.onosTime
+  
+      rankStr = str(width) + 'ms' 
+      if (percent < 0.09):        # The bars aren't wide enough to print the ranking inside
+          xloc = offset + width + onePercent   # Shift the text to the right side of the right edge
+          clr = 'black'      # Black against white background
+          align = 'left'
+      else:
+          xloc = offset + 0.98*width  # Shift the text to the left side of the right edge
+          clr = 'white'      # White on magenta
+          align = 'right'
+  
+      # Center the text vertically in the bar
+      yloc = rect.get_y()+rect.get_height()/2.0
+      ax1.text(xloc, yloc, rankStr, horizontalalignment=align,
+              verticalalignment='center', color=clr)
+  
+  plt.show()
+  plt.savefig('test.png')
 if __name__ == '__main__':
   n = N 
   runPerf(n)
diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
index 6638ac0..37ed4aa 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -360,8 +360,8 @@
 		List<Link> reverseLinks = linkStore.getReverseLinks(switchId, port.getPortNumber());
 		links.addAll(reverseLinks);
 
+		PerformanceMonitor.stop("SwitchPortRemoved.DbAccess");
 		if (swStore.deletePort(HexString.toHexString(switchId), port.getPortNumber())) {
-		    PerformanceMonitor.stop("SwitchPortRemoved.DbAccess");
 		    PerformanceMonitor.start("SwitchPortRemoved.NotificationSend");
 		    // TODO publish DELETE_PORT event here
 		    TopologyElement topologyElement =
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 50834d2..55aeb97 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
@@ -268,7 +268,7 @@
 	    PerformanceMonitor.Measurement m;
 	    m = PerformanceMonitor.start(tag1);
 	    boolean success = FlowDatabaseOperation.addFlow(dbHandler, flowPath);
-	    PerformanceMonitor.stop(tag1);
+//	    PerformanceMonitor.stop(tag1);
 	    m.stop();
 	    m = PerformanceMonitor.start(tag2);
 	    if(success) {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
index 7c38a3c..fa75460 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
@@ -54,13 +54,11 @@
     public static void stop(String tag) {
 	long time = System.nanoTime();
 	List<Measurement> list = map.get(tag);
-	if(list == null) {
+	if(list == null || list.size() == 0) {
 	    log.error("Tag {} does not exist", tag);
 	}
-	else if(list.size() == 1) {
-	    list.get(0).stop(time);
-	}
-	else {
+	list.get(0).stop(time);
+	if(list.size() > 1) {
 	    log.error("Tag {} has multiple measurements", tag);
 	}
 	overhead += System.nanoTime() - time;
@@ -92,6 +90,9 @@
 	    int 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;
@@ -101,8 +102,7 @@
 		    if(stop > experimentEnd) {
 			experimentEnd = stop;
 		    }
-		}
-		
+		}		
 		// Collect statistics for average
 		total += m.elapsed();
 		count++;
@@ -155,7 +155,9 @@
 	 * Start the measurement
 	 */
 	public void start() {
-	    start = System.nanoTime();
+	    if(start <= 0) {
+		start = System.nanoTime();
+	    }
 	}
 	
 	/**
@@ -171,7 +173,9 @@
 	 * @param time to stop
 	 */
 	public void stop(long time){
-	    stop = time;
+	    if(stop <= 0) {
+		stop = time;
+	    }
 	}
 	
 	/**
@@ -217,15 +221,24 @@
 	    report();
 	    clear();
 	}
-//	for(int i = 0; i < 100; i++){
-//	    tag = "a";
-//	    start(tag); stop(tag);
-//	    tag = "b";
-//	    start(tag); stop(tag);
-//	    tag = "c";
-//	    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();
+	}
     }
 }