From eae5ef7cfee9bacecc5281cc378a904fe9ae4b96 Mon Sep 17 00:00:00 2001 From: Jason Ye Date: Wed, 12 Jun 2013 22:18:03 -0700 Subject: [PATCH] Fix bulk sync in SwitchMananger. When node connector is added to a container, notify node addition if it was not present in the container. Signed-off-by: Jason Ye --- .../openflow/internal/InventoryService.java | 27 +++++++++++++++---- .../internal/InventoryServiceShim.java | 19 ++++++++++++- .../internal/SwitchManagerImpl.java | 21 +++++++++------ 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryService.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryService.java index ec6ea1223e..4869a9500b 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryService.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/InventoryService.java @@ -53,6 +53,7 @@ public class InventoryService implements IInventoryShimInternalListener, private ConcurrentMap> nodeProps; // properties are maintained in global container only private ConcurrentMap> nodeConnectorProps; // properties are maintained in global container only private boolean isDefaultContainer = false; + private String containerName = null; void setController(IController s) { this.controller = s; @@ -75,7 +76,7 @@ public class InventoryService implements IInventoryShimInternalListener, Dictionary props = c.getServiceProperties(); if (props != null) { - String containerName = (String) props.get("containerName"); + containerName = (String) props.get("containerName"); isDefaultContainer = containerName.equals(GlobalConstants.DEFAULT .toString()); } @@ -146,6 +147,7 @@ public class InventoryService implements IInventoryShimInternalListener, */ @Override public ConcurrentMap> getNodeProps() { + logger.debug("getNodePros for container {}", containerName); return nodeProps; } @@ -212,15 +214,30 @@ public class InventoryService implements IInventoryShimInternalListener, } private void addNode(Node node, Set props) { - logger.trace("{} added, props: {}", node, props); if (nodeProps == null) { return; } + Set nodeSet = nodeProps.keySet(); + if (((props == null) || props.isEmpty()) && (nodeSet != null) + && nodeSet.contains(node)) { + // node already added + return; + } + + logger.trace("addNode: {} added, props: {} for container {}", + new Object[] { node, props, containerName }); + // update local cache - Map propMap = new HashMap(); - for (Property prop : props) { - propMap.put(prop.getName(), prop); + Map propMap = nodeProps.get(node); + if (propMap == null) { + propMap = new HashMap(); + } + + if (props != null) { + for (Property prop : props) { + propMap.put(prop.getName(), prop); + } } nodeProps.put(node, propMap); 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 f7210a333b..e2d77b5b73 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 @@ -236,6 +236,8 @@ public class InventoryServiceShim implements IContainerListener, @Override public void tagUpdated(String containerName, Node n, short oldTag, short newTag, UpdateType t) { + logger.debug("tagUpdated: {} type {} for container {}", new Object[] { + n, t, containerName }); } @Override @@ -246,6 +248,8 @@ public class InventoryServiceShim implements IContainerListener, @Override public void nodeConnectorUpdated(String containerName, NodeConnector p, UpdateType t) { + logger.debug("nodeConnectorUpdated: {} type {} for container {}", + new Object[] { p, t, containerName }); if (this.containerMap == null) { logger.error("containerMap is NULL"); return; @@ -283,6 +287,7 @@ public class InventoryServiceShim implements IContainerListener, // notify InventoryService notifyInventoryShimInternalListener(containerName, p, t, null); + notifyInventoryShimInternalListener(containerName, p.getNode(), t, null); } private void notifyInventoryShimExternalListener(Node node, @@ -308,7 +313,7 @@ public class InventoryServiceShim implements IContainerListener, type, props); logger.trace( "notifyInventoryShimInternalListener {} type {} for container {}", - nodeConnector, type, container); + new Object[] { nodeConnector, type, container }); } } @@ -373,6 +378,18 @@ public class InventoryServiceShim implements IContainerListener, notifyInventoryShimExternalListener(node, type, props); } + private void notifyInventoryShimInternalListener(String container, + Node node, UpdateType type, Set props) { + IInventoryShimInternalListener inventoryShimInternalListener = inventoryShimInternalListeners + .get(container); + if (inventoryShimInternalListener != null) { + inventoryShimInternalListener.updateNode(node, type, props); + logger.trace( + "notifyInventoryShimInternalListener {} type {} for container {}", + new Object[] { node, type, container }); + } + } + private void addNode(ISwitch sw) { Node node; try { diff --git a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java index 971213e483..443c7a42ab 100644 --- a/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java +++ b/opendaylight/switchmanager/implementation/src/main/java/org/opendaylight/controller/switchmanager/internal/SwitchManagerImpl.java @@ -820,6 +820,8 @@ CommandProvider { @Override public void updateNode(Node node, UpdateType type, Set props) { + log.debug("updateNode: {} type {} props {} for container {}", + new Object[] { node, type, props, containerName }); switch (type) { case ADDED: addNode(node, props); @@ -841,7 +843,8 @@ CommandProvider { Node node = nodeConnector.getNode(); Map propMap = new HashMap(); - log.trace("{} {}", nodeConnector, type); + log.debug("updateNodeConnector: {} type {} props {} for container {}", + new Object[] { nodeConnector, type, props, containerName }); if (nodeConnectorProps == null) { return; @@ -1335,6 +1338,8 @@ CommandProvider { Set nodeSet = nodeProps.keySet(); if (nodeSet != null) { for (Node node : nodeSet) { + log.debug("getInventories: {} added for container {}", + new Object[] { node, containerName }); addNode(node, null); } } @@ -1384,17 +1389,17 @@ CommandProvider { } private void bulkUpdateService(IInventoryListener service) { + Map propMap; + UpdateType type = UpdateType.ADDED; + for (Node node : getNodes()) { - service.notifyNode(node, UpdateType.ADDED, null); + propMap = nodeProps.get(node); + service.notifyNode(node, type, propMap); } - Map propMap = new HashMap(); - propMap.put(State.StatePropName, new State(State.EDGE_UP)); for (NodeConnector nodeConnector : nodeConnectorProps.keySet()) { - if (isNodeConnectorEnabled(nodeConnector)) { - service.notifyNodeConnector(nodeConnector, UpdateType.ADDED, - propMap); - } + propMap = nodeConnectorProps.get(nodeConnector); + service.notifyNodeConnector(nodeConnector, type, propMap); } } -- 2.36.6