Merge "Fix for cache cleanup in protocol plugin on container deletion"
authorGiovanni Meo <gmeo@cisco.com>
Fri, 13 Sep 2013 15:24:27 +0000 (15:24 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 13 Sep 2013 15:24:27 +0000 (15:24 +0000)
1  2 
opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java
opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java

index 869d36d9cbf815142b430e093a72fb22aedfd439,592e336b0be58541577b0dfd0c61c28a7178face..012807eee9ff622e5469a035b2a0e0e7b3294496
@@@ -560,11 -560,10 +560,11 @@@ public class DiscoveryService implement
      private void addDiscovery(Node node) {
          Map<Long, ISwitch> switches = controller.getSwitches();
          ISwitch sw = switches.get(node.getID());
 -        List<OFPhysicalPort> ports = sw.getEnabledPorts();
 -        if (ports == null) {
 +        if (sw == null) {
 +            //switch could be removed by now, stop propagation
              return;
          }
 +        List<OFPhysicalPort> ports = sw.getEnabledPorts();
          for (OFPhysicalPort port : ports) {
              NodeConnector nodeConnector = NodeConnectorCreator.createOFNodeConnector(port.getPortNumber(), node);
              if (!readyListHi.contains(nodeConnector)) {
          }
          return ports;
      }
  }
index 92eec43b4ce58487465ae243c46aa3c0f87b6027,adc121816b818d099469aa1919b74b2295b60152..8db83f0fc7e2449b99079aadf5dfc709204f2f35
@@@ -32,6 -32,7 +32,7 @@@ import org.opendaylight.controller.sal.
  import org.opendaylight.controller.sal.core.Capabilities;
  import org.opendaylight.controller.sal.core.ContainerFlow;
  import org.opendaylight.controller.sal.core.Description;
+ import org.opendaylight.controller.sal.core.IContainerAware;
  import org.opendaylight.controller.sal.core.IContainerListener;
  import org.opendaylight.controller.sal.core.MacAddress;
  import org.opendaylight.controller.sal.core.Node;
@@@ -59,7 -60,7 +60,7 @@@ import org.slf4j.LoggerFactory
   *
   */
  public class InventoryServiceShim implements IContainerListener,
-         IMessageListener, ISwitchStateListener, IOFStatisticsListener {
+         IMessageListener, ISwitchStateListener, IOFStatisticsListener, IContainerAware {
      protected static final Logger logger = LoggerFactory
              .getLogger(InventoryServiceShim.class);
      private IController controller = null;
      }
  
      void setInventoryShimExternalListener(IInventoryShimExternalListener s) {
-         logger.trace("Set inventoryShimExternalListener");
+         logger.trace("Set inventoryShimExternalListener {}", s);
          if ((this.inventoryShimExternalListeners != null)
                  && !this.inventoryShimExternalListeners.contains(s)) {
              this.inventoryShimExternalListeners.add(s);
      }
  
      void unsetInventoryShimExternalListener(IInventoryShimExternalListener s) {
+         logger.trace("Unset inventoryShimExternalListener {}", s);
          if ((this.inventoryShimExternalListeners != null)
                  && this.inventoryShimExternalListeners.contains(s)) {
              this.inventoryShimExternalListeners.remove(s);
          Set<Property> props = new HashSet<Property>();
          Long sid = (Long) node.getID();
  
 -        Date connectedSince = controller.getSwitches().get(sid)
 -                .getConnectedDate();
 +        Date connectedSince = sw.getConnectedDate();
          Long connectedSinceTime = (connectedSince == null) ? 0 : connectedSince
                  .getTime();
          props.add(new TimeStamp(connectedSinceTime, "connectedSince"));
      public void tableStatisticsRefreshed(Long switchId, List<OFStatistics> tables) {
          // Nothing to do
      }
+     @Override
+     public void containerCreate(String containerName) {
+         // Nothing to do
+     }
+     @Override
+     public void containerDestroy(String containerName) {
+         Set<NodeConnector> removeNodeConnectorSet = new HashSet<NodeConnector>();
+         Set<Node> removeNodeSet = new HashSet<Node>();
+         for (Map.Entry<NodeConnector, Set<String>> entry : nodeConnectorContainerMap.entrySet()) {
+             Set<String> ncContainers = entry.getValue();
+             if (ncContainers.contains(containerName)) {
+                 NodeConnector nodeConnector = entry.getKey();
+                 removeNodeConnectorSet.add(nodeConnector);
+             }
+         }
+         for (Map.Entry<Node, Set<String>> entry : nodeContainerMap.entrySet()) {
+             Set<String> nodeContainers = entry.getValue();
+             if (nodeContainers.contains(containerName)) {
+                 Node node = entry.getKey();
+                 removeNodeSet.add(node);
+             }
+         }
+         for (NodeConnector nodeConnector : removeNodeConnectorSet) {
+             Set<String> ncContainers = nodeConnectorContainerMap.get(nodeConnector);
+             ncContainers.remove(containerName);
+             if (ncContainers.isEmpty()) {
+                 nodeConnectorContainerMap.remove(nodeConnector);
+             }
+         }
+         for (Node node : removeNodeSet) {
+             Set<String> nodeContainers = nodeContainerMap.get(node);
+             nodeContainers.remove(containerName);
+             if (nodeContainers.isEmpty()) {
+                 nodeContainerMap.remove(node);
+             }
+         }
+     }
  }