From a2e0ce161dfaa25245e24f2899b2a020298c5920 Mon Sep 17 00:00:00 2001 From: Yevgeny Khodorkovsky Date: Mon, 5 Aug 2013 21:20:17 -0700 Subject: [PATCH] Bugfix: switch removal not notified to FMs This fixes a bug where switch removal event is discarded in OF plugin because node locality is established incorrectly. Change-Id: I90f2c27cb0c59af58940433c468502e9900306b6 Signed-off-by: Yevgeny Khodorkovsky --- .../internal/InventoryServiceShim.java | 87 +++++++++++-------- 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java index 241fa92deb..9e01796806 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryServiceShim.java @@ -381,57 +381,68 @@ public class InventoryServiceShim implements IContainerListener, * Notify all internal and external listeners */ private void notifyInventoryShimListener(NodeConnector nodeConnector, UpdateType type, Set props) { - notifyGlobalInventoryShimInternalListener(nodeConnector, type, props); - /* - * isLocal is intentionally moved after the GlobalInventory listener call. - * The above notification to GlobalInventory will make sure that the connectionOutService be ready - * to reply to isLocal query. - */ - if (!connectionOutService.isLocal(nodeConnector.getNode())) { - logger.debug("Connection service dropped the inventory notification for {} {}", nodeConnector.toString(), type); - return; + + //establish locality before notifying + boolean isNodeLocal; + if (type == UpdateType.REMOVED){ + //if removing get the locality first + isNodeLocal = connectionOutService.isLocal(nodeConnector.getNode()); + notifyGlobalInventoryShimInternalListener(nodeConnector, type, props); } else { - logger.debug("Connection service accepted the inventory notification for {} {}", nodeConnector.toString(), type); + notifyGlobalInventoryShimInternalListener(nodeConnector, type, props); + isNodeLocal = connectionOutService.isLocal(nodeConnector.getNode()); } - // notify other containers - Set containers = (nodeConnectorContainerMap.get(nodeConnector) == null) ? new HashSet() - : new HashSet(nodeConnectorContainerMap.get(nodeConnector)); - containers.add(GlobalConstants.DEFAULT.toString()); - for (String container : containers) { - notifyInventoryShimInternalListener(container, nodeConnector, type, props); - } + if (isNodeLocal) { + // notify other containers + Set containers = (nodeConnectorContainerMap.get(nodeConnector) == null) ? new HashSet() + : new HashSet(nodeConnectorContainerMap.get(nodeConnector)); + containers.add(GlobalConstants.DEFAULT.toString()); + for (String container : containers) { + notifyInventoryShimInternalListener(container, nodeConnector, type, props); + } - // Notify DiscoveryService - notifyInventoryShimExternalListener(nodeConnector, type, props); + // Notify DiscoveryService + notifyInventoryShimExternalListener(nodeConnector, type, props); + + logger.debug("Connection service accepted the inventory notification for {} {}", nodeConnector, type); + } else { + logger.debug("Connection service dropped the inventory notification for {} {}", nodeConnector, type); + } } /* * Notify all internal and external listeners */ private void notifyInventoryShimListener(Node node, UpdateType type, Set props) { - notifyGlobalInventoryShimInternalListener(node, type, props); - /* - * isLocal is intentionally moved after the GlobalInventory listener call. - * The above notification to GlobalInventory will make sure that the connectionOutService be ready - * to reply to isLocal query. - */ - if (!connectionOutService.isLocal(node)) { - logger.debug("Connection service dropped the inventory notification for {} {}", node.toString(), type); - return; + + //establish locality before notifying + boolean isNodeLocal; + if (type == UpdateType.REMOVED){ + //if removing get the locality first + isNodeLocal = connectionOutService.isLocal(node); + notifyGlobalInventoryShimInternalListener(node, type, props); } else { - logger.debug("Connection service accepted the inventory notification for {} {}", node.toString(), type); - } - // Now notify other containers - Set containers = (nodeContainerMap.get(node) == null) ? new HashSet() : new HashSet( - nodeContainerMap.get(node)); - containers.add(GlobalConstants.DEFAULT.toString()); - for (String container : containers) { - notifyInventoryShimInternalListener(container, node, type, props); + notifyGlobalInventoryShimInternalListener(node, type, props); + isNodeLocal = connectionOutService.isLocal(node); } - // Notify external listener - notifyInventoryShimExternalListener(node, type, props); + if (isNodeLocal) { + // Now notify other containers + Set containers = (nodeContainerMap.get(node) == null) ? new HashSet() : new HashSet( + nodeContainerMap.get(node)); + containers.add(GlobalConstants.DEFAULT.toString()); + for (String container : containers) { + notifyInventoryShimInternalListener(container, node, type, props); + } + + // Notify external listener + notifyInventoryShimExternalListener(node, type, props); + + logger.debug("Connection service accepted the inventory notification for {} {}", node, type); + } else { + logger.debug("Connection service dropped the inventory notification for {} {}", node, type); + } } private void notifyGlobalInventoryShimInternalListener(Node node, UpdateType type, Set props) { -- 2.36.6