X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fprotocol_plugins%2Fopenflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fprotocol_plugin%2Fopenflow%2Finternal%2FDiscoveryService.java;h=0895d9af27c85132965a98ea23cd166784a3e538;hb=0e4d6083e5d4f7b22e909f86f9471f981d7ca8f3;hp=bb303e3651de7e3a95659641cf001da4b0153bb4;hpb=d4b6addab23cf24f20cd7969a7f1d800fda2bac1;p=controller.git 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 bb303e3651..0895d9af27 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 @@ -61,8 +61,6 @@ import org.opendaylight.controller.sal.utils.HexEncode; import org.opendaylight.controller.sal.utils.NetUtils; import org.opendaylight.controller.sal.utils.NodeConnectorCreator; import org.opendaylight.controller.sal.utils.NodeCreator; -import org.opendaylight.controller.sal.utils.Status; -import org.opendaylight.controller.sal.utils.StatusCode; /** * The class describes neighbor discovery service for an OpenFlow network. @@ -133,6 +131,7 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa class DiscoveryTransmit implements Runnable { private final BlockingQueue transmitQ; + private int count = 0; DiscoveryTransmit(BlockingQueue transmitQ) { this.transmitQ = transmitQ; @@ -146,6 +145,9 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa RawPacket outPkt = createDiscoveryPacket(nodeConnector); sendDiscoveryPacket(nodeConnector, outPkt); nodeConnector = null; + if ((++count & 0x7f) == 0) { + Thread.sleep(10); + } } catch (InterruptedException e1) { logger.warn("DiscoveryTransmit interupted", e1.getMessage()); if (shuttingDown) { @@ -579,6 +581,14 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa readyListHi.add(nodeConnector); } + private void removeNodeConnector(NodeConnector nodeConnector) { + readyListLo.remove(nodeConnector); + readyListHi.remove(nodeConnector); + stagingList.remove(nodeConnector); + holdTime.remove(nodeConnector); + elapsedTime.remove(nodeConnector); + } + private Set getRemoveSet(Collection c, Node node) { Set removeSet = new HashSet(); if (c == null) { @@ -586,16 +596,7 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa } for (NodeConnector nodeConnector : c) { if (node.equals(nodeConnector.getNode())) { - Edge edge1 = edgeMap.get(nodeConnector); - if (edge1 != null) { - removeSet.add(nodeConnector); - - // check reverse direction - Edge edge2 = edgeMap.get(edge1.getTailNodeConnector()); - if ((edge2 != null) && node.equals(edge2.getTailNodeConnector().getNode())) { - removeSet.add(edge2.getHeadNodeConnector()); - } - } + removeSet.add(nodeConnector); } } return removeSet; @@ -604,6 +605,29 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa private void removeDiscovery(Node node) { Set removeSet; + removeSet = getRemoveSet(edgeMap.keySet(), node); + NodeConnector peerConnector; + Edge edge1, edge2; + for (NodeConnector nodeConnector : removeSet) { + // get the peer for fast removal of the edge in reverse direction + peerConnector = null; + edge1 = edgeMap.get(nodeConnector); + if (edge1 != null) { + edge2 = edgeMap.get(edge1.getTailNodeConnector()); + if ((edge2 != null) && node.equals(edge2.getTailNodeConnector().getNode())) { + peerConnector = edge2.getHeadNodeConnector(); + } + } + + removeEdge(nodeConnector, false); + removeEdge(peerConnector, isEnabled(peerConnector)); + } + + removeSet = getRemoveSet(prodMap.keySet(), node); + for (NodeConnector nodeConnector : removeSet) { + removeProdEdge(nodeConnector); + } + removeSet = getRemoveSet(readyListHi, node); readyListHi.removeAll(removeSet); @@ -618,22 +642,14 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa holdTime.remove(nodeConnector); } - removeSet = getRemoveSet(edgeMap.keySet(), node); - for (NodeConnector nodeConnector : removeSet) { - removeEdge(nodeConnector, false); - } - - removeSet = getRemoveSet(prodMap.keySet(), node); + removeSet = getRemoveSet(elapsedTime.keySet(), node); for (NodeConnector nodeConnector : removeSet) { - removeProdEdge(nodeConnector); + elapsedTime.remove(nodeConnector); } } private void removeDiscovery(NodeConnector nodeConnector) { - readyListHi.remove(nodeConnector); - readyListLo.remove(nodeConnector); - stagingList.remove(nodeConnector); - holdTime.remove(nodeConnector); + removeNodeConnector(nodeConnector); removeEdge(nodeConnector, false); removeProdEdge(nodeConnector); } @@ -672,7 +688,6 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa for (NodeConnector nodeConnector : retrySet) { // Allow one more retry - readyListLo.add(nodeConnector); elapsedTime.remove(nodeConnector); if (connectionOutService.isLocal(nodeConnector.getNode())) { transmitQ.add(nodeConnector); @@ -805,6 +820,11 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa } elapsedTime.remove(src); + // fast discovery of the edge in reverse direction + if (!edgeMap.containsKey(dst) && !readyListHi.contains(dst) && !elapsedTime.keySet().contains(dst)) { + moveToReadyListHi(dst); + } + // notify updateEdge(edge, UpdateType.ADDED, props); logger.trace("Add edge {}", edge); @@ -871,18 +891,15 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa * Remove OpenFlow edge */ private void removeEdge(NodeConnector nodeConnector, boolean stillEnabled) { - holdTime.remove(nodeConnector); - readyListLo.remove(nodeConnector); - readyListHi.remove(nodeConnector); + if (nodeConnector == null) { + return; + } + + removeNodeConnector(nodeConnector); if (stillEnabled) { // keep discovering - if (!stagingList.contains(nodeConnector)) { - stagingList.add(nodeConnector); - } - } else { - // stop it - stagingList.remove(nodeConnector); + stagingList.add(nodeConnector); } Edge edge = null; @@ -1240,7 +1257,15 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa if (val != null) { try { - int ticks = Integer.parseInt(val); + int ticks; + Set monitorSet = holdTime.keySet(); + if (monitorSet != null) { + for (NodeConnector nodeConnector : monitorSet) { + holdTime.put(nodeConnector, 0); + } + } + + ticks = Integer.parseInt(val); DiscoveryPeriod.INTERVAL.setTick(ticks); discoveryBatchRestartTicks = getDiscoveryInterval(); discoveryBatchPauseTicks = getDiscoveryPauseInterval(); @@ -1658,7 +1683,7 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa */ private int getDiscoveryBatchMaxPorts() { String val = System.getProperty("of.discoveryBatchMaxPorts"); - int ports = 1024; + int ports = 512; if (val != null) { try {