Merge "bug 741 - Make sure to stop threads on bundle stop on TopologyServiceShim"
[controller.git] / opendaylight / protocol_plugins / openflow / src / main / java / org / opendaylight / controller / protocol_plugin / openflow / internal / TopologyServiceShim.java
index bb5681b2dff0dbc988407885fa6b65599617617a..08ddbde30af11d3551447e9cb03f05a405e35887 100644 (file)
@@ -141,7 +141,7 @@ public class TopologyServiceShim implements IDiscoveryListener,
 
                     Thread.sleep(100);
                 } catch (InterruptedException e1) {
-                    logger.warn("TopologyNotify interrupted {}",
+                    logger.trace("TopologyNotify interrupted {}",
                             e1.getMessage());
                     if (shuttingDown) {
                         return;
@@ -180,21 +180,27 @@ public class TopologyServiceShim implements IDiscoveryListener,
                     for (String container : containerList) {
                         Map<NodeConnector, Pair<Edge, Set<Property>>> edgePropsMap = edgeMap
                                 .get(container);
-                        Edge edge = edgePropsMap.get(connector).getLeft();
-                        if (edge.getTailNodeConnector().equals(connector)) {
-                            ITopologyServiceShimListener topologServiceShimListener = topologyServiceShimListeners
-                                    .get(container);
-                            if (update.type == UpdateType.ADDED) {
-                                topologServiceShimListener
-                                        .edgeOverUtilized(edge);
-                            } else {
-                                topologServiceShimListener
-                                        .edgeUtilBackToNormal(edge);
+                        // the edgePropsMap for a particular container may not have
+                        // the connector.
+                        // so check for null
+                        Pair<Edge, Set<Property>> edgeProp = edgePropsMap.get(connector);
+                        if(edgeProp != null) {
+                            Edge edge = edgeProp.getLeft();
+                            if (edge.getTailNodeConnector().equals(connector)) {
+                                ITopologyServiceShimListener topologServiceShimListener = topologyServiceShimListeners
+                                        .get(container);
+                                if (update.type == UpdateType.ADDED) {
+                                    topologServiceShimListener
+                                    .edgeOverUtilized(edge);
+                                } else {
+                                    topologServiceShimListener
+                                    .edgeUtilBackToNormal(edge);
+                                }
                             }
                         }
                     }
                 } catch (InterruptedException e1) {
-                    logger.warn(
+                    logger.trace(
                             "Edge Bandwidth Utilization Notify Thread interrupted {}",
                             e1.getMessage());
                     if (shuttingDown) {
@@ -229,10 +235,9 @@ public class TopologyServiceShim implements IDiscoveryListener,
                         logger.debug("Bulk Notify container:{}", containerName);
                         TopologyBulkUpdate(containerName);
                     } catch (InterruptedException e) {
-                        logger.warn("Topology Bulk update thread interrupted");
+                        logger.trace("Topology Bulk update thread interrupted");
                         if (shuttingDown) {
-                            return;
-                        }
+                            return;                        }
                     }
                 }
             }
@@ -259,6 +264,10 @@ public class TopologyServiceShim implements IDiscoveryListener,
     protected void pollTxBitRates() {
         Map<NodeConnector, Pair<Edge, Set<Property>>> globalContainerEdges = edgeMap
                 .get(GlobalConstants.DEFAULT.toString());
+        if (shuttingDown) {
+            logger.trace("Getting out the pollTxBitRates because bundle going down");
+            return;
+        }
         if (globalContainerEdges == null) {
             return;
         }
@@ -298,18 +307,18 @@ public class TopologyServiceShim implements IDiscoveryListener,
             // Compare bandwidth usage
             Long switchId = (Long) connector.getNode().getID();
             Short port = (Short) connector.getID();
-            float rate = statsMgr.getTransmitRate(switchId, port);
-            if (rate > bwThresholdFactor * bw) {
-                if (!connectorsOverUtilized.contains(connector)) {
-                    connectorsOverUtilized.add(connector);
-                    this.bwUtilNotifyQ.add(new UtilizationUpdate(connector,
-                            UpdateType.ADDED));
-                }
-            } else {
-                if (connectorsOverUtilized.contains(connector)) {
-                    connectorsOverUtilized.remove(connector);
-                    this.bwUtilNotifyQ.add(new UtilizationUpdate(connector,
-                            UpdateType.REMOVED));
+            if (statsMgr != null) {
+                float rate = statsMgr.getTransmitRate(switchId, port);
+                if (rate > bwThresholdFactor * bw) {
+                    if (!connectorsOverUtilized.contains(connector)) {
+                        connectorsOverUtilized.add(connector);
+                        this.bwUtilNotifyQ.add(new UtilizationUpdate(connector, UpdateType.ADDED));
+                    }
+                } else {
+                    if (connectorsOverUtilized.contains(connector)) {
+                        connectorsOverUtilized.remove(connector);
+                        this.bwUtilNotifyQ.add(new UtilizationUpdate(connector, UpdateType.REMOVED));
+                    }
                 }
             }
         }
@@ -351,6 +360,9 @@ public class TopologyServiceShim implements IDiscoveryListener,
         logger.trace("STOP called!");
         shuttingDown = true;
         notifyThread.interrupt();
+        bwUtilNotifyThread.interrupt();
+        ofPluginTopoBulkUpdate.interrupt();
+        pollTimer.cancel();
     }
 
     void setTopologyServiceShimListener(Map<?, ?> props,