From: Alessandro Boch Date: Tue, 11 Mar 2014 15:47:57 +0000 (+0000) Subject: Merge "Topology Manager to avoid redundant edge updates" X-Git-Tag: autorelease-tag-v20140601202136_82eb3f9~341 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=7312d7684413675e8dda5e3616deaa727e6d18ba;hp=4b3b7ad70a58d1b741cac2cb8ff00d614a8bc8cd Merge "Topology Manager to avoid redundant edge updates" --- diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java index b29ce15f56..548bfb1f9f 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java @@ -836,8 +836,10 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa moveToReadyListHi(dst); } + //checking only OF map, since production edge discovery always overwrites any existing edge + UpdateType ut = edgeMap.containsKey(dst) ? UpdateType.CHANGED : UpdateType.ADDED; // notify - updateEdge(edge, UpdateType.ADDED, props); + updateEdge(edge, ut, props); logger.trace("Add edge {}", edge); } @@ -936,6 +938,7 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa return; } + this.discoveryListener.notifyEdge(edge, type, props); NodeConnector src = edge.getTailNodeConnector(), dst = edge.getHeadNodeConnector(); diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/TopoEdgeUpdate.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/TopoEdgeUpdate.java index 0208cc7cda..f972ae6a66 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/TopoEdgeUpdate.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/topology/TopoEdgeUpdate.java @@ -16,6 +16,7 @@ import org.opendaylight.controller.sal.core.UpdateType; /** * The class represents an Edge, the Edge's Property Set and its UpdateType. + * If update is on new properties added to an existing edge, appropriate type is CHANGED. */ public class TopoEdgeUpdate { private Edge edge; diff --git a/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java b/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java index cc1a8b868d..ff1c026a34 100644 --- a/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java +++ b/opendaylight/topologymanager/implementation/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java @@ -573,6 +573,13 @@ public class TopologyManagerImpl implements switch (type) { case ADDED: + + if (this.edgesDB.containsKey(e)) { + // Avoid redundant updates (e.g. cluster switch-over) as notifications trigger expensive tasks + log.trace("Skipping redundant edge addition: {}", e); + return null; + } + // Make sure the props are non-null or create a copy if (props == null) { props = new HashSet(); @@ -580,19 +587,6 @@ public class TopologyManagerImpl implements props = new HashSet(props); } - Set currentProps = this.edgesDB.get(e); - if (currentProps != null) { - - if (currentProps.equals(props)) { - // Avoid redundant updates as notifications trigger expensive tasks - log.trace("Skipping redundant edge addition: {}", e); - return null; - } - - // In case of node switch-over to a different cluster controller, - // let's retain edge props (e.g. creation time) - props.addAll(currentProps); - } // Ensure that head node connector exists if (!headNodeConnectorExist(e)) { @@ -654,10 +648,9 @@ public class TopologyManagerImpl implements case CHANGED: Set oldProps = this.edgesDB.get(e); - // When property changes lets make sure we can change it + // When property(s) changes lets make sure we can change it // all except the creation time stamp because that should - // be changed only when the edge is destroyed and created - // again + // be set only when the edge is created TimeStamp timeStamp = null; for (Property prop : oldProps) { if (prop instanceof TimeStamp) {