LLDP LinkDiscovery related fix
- avoid LinkDiscovery from start()-ing multiple times - Only check device mastership at beginning of probe interval Change-Id: I0cece8fbcf2a031ea3ac603c6f51dbe87ad454ad
Showing
2 changed files
with
24 additions
and
6 deletions
| ... | @@ -145,7 +145,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -145,7 +145,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
| 145 | break; | 145 | break; |
| 146 | case PORT_ADDED: | 146 | case PORT_ADDED: |
| 147 | case PORT_UPDATED: | 147 | case PORT_UPDATED: |
| 148 | - if (event.port().isEnabled()) { | 148 | + if (port.isEnabled()) { |
| 149 | ld = discoverers.get(device.id()); | 149 | ld = discoverers.get(device.id()); |
| 150 | if (ld == null) { | 150 | if (ld == null) { |
| 151 | return; | 151 | return; |
| ... | @@ -155,6 +155,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -155,6 +155,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
| 155 | ld.addPort(port); | 155 | ld.addPort(port); |
| 156 | } | 156 | } |
| 157 | } else { | 157 | } else { |
| 158 | + log.debug("Port down {}", port); | ||
| 158 | ConnectPoint point = new ConnectPoint(device.id(), | 159 | ConnectPoint point = new ConnectPoint(device.id(), |
| 159 | port.number()); | 160 | port.number()); |
| 160 | providerService.linksVanished(point); | 161 | providerService.linksVanished(point); | ... | ... |
| ... | @@ -68,6 +68,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -68,6 +68,7 @@ public class LinkDiscovery implements TimerTask { |
| 68 | // send 1 probe every probeRate milliseconds | 68 | // send 1 probe every probeRate milliseconds |
| 69 | private final long probeRate; | 69 | private final long probeRate; |
| 70 | private final Set<Long> slowPorts; | 70 | private final Set<Long> slowPorts; |
| 71 | + // ports, known to have incoming links | ||
| 71 | private final Set<Long> fastPorts; | 72 | private final Set<Long> fastPorts; |
| 72 | // number of unacknowledged probes per port | 73 | // number of unacknowledged probes per port |
| 73 | private final Map<Long, AtomicInteger> portProbeCount; | 74 | private final Map<Long, AtomicInteger> portProbeCount; |
| ... | @@ -125,6 +126,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -125,6 +126,7 @@ public class LinkDiscovery implements TimerTask { |
| 125 | log.info("Using BDDP to discover network"); | 126 | log.info("Using BDDP to discover network"); |
| 126 | } | 127 | } |
| 127 | 128 | ||
| 129 | + this.isStopped = true; | ||
| 128 | start(); | 130 | start(); |
| 129 | this.log.debug("Started discovery manager for switch {}", | 131 | this.log.debug("Started discovery manager for switch {}", |
| 130 | device.id()); | 132 | device.id()); |
| ... | @@ -140,7 +142,10 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -140,7 +142,10 @@ public class LinkDiscovery implements TimerTask { |
| 140 | public void addPort(final Port port) { | 142 | public void addPort(final Port port) { |
| 141 | this.log.debug("Sending init probe to port {}@{}", | 143 | this.log.debug("Sending init probe to port {}@{}", |
| 142 | port.number().toLong(), device.id()); | 144 | port.number().toLong(), device.id()); |
| 143 | - sendProbes(port.number().toLong()); | 145 | + boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; |
| 146 | + if (isMaster) { | ||
| 147 | + sendProbes(port.number().toLong()); | ||
| 148 | + } | ||
| 144 | synchronized (this) { | 149 | synchronized (this) { |
| 145 | this.slowPorts.add(port.number().toLong()); | 150 | this.slowPorts.add(port.number().toLong()); |
| 146 | } | 151 | } |
| ... | @@ -233,6 +238,13 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -233,6 +238,13 @@ public class LinkDiscovery implements TimerTask { |
| 233 | */ | 238 | */ |
| 234 | @Override | 239 | @Override |
| 235 | public void run(final Timeout t) { | 240 | public void run(final Timeout t) { |
| 241 | + boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; | ||
| 242 | + if (!isMaster) { | ||
| 243 | + // reschedule timer | ||
| 244 | + timeout = Timer.getTimer().newTimeout(this, this.probeRate, MILLISECONDS); | ||
| 245 | + return; | ||
| 246 | + } | ||
| 247 | + | ||
| 236 | this.log.trace("Sending probes from {}", device.id()); | 248 | this.log.trace("Sending probes from {}", device.id()); |
| 237 | synchronized (this) { | 249 | synchronized (this) { |
| 238 | final Iterator<Long> fastIterator = this.fastPorts.iterator(); | 250 | final Iterator<Long> fastIterator = this.fastPorts.iterator(); |
| ... | @@ -245,6 +257,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -245,6 +257,7 @@ public class LinkDiscovery implements TimerTask { |
| 245 | sendProbes(portNumber); | 257 | sendProbes(portNumber); |
| 246 | 258 | ||
| 247 | } else { | 259 | } else { |
| 260 | + // Link down, demote to slowPorts | ||
| 248 | // Update fast and slow ports | 261 | // Update fast and slow ports |
| 249 | fastIterator.remove(); | 262 | fastIterator.remove(); |
| 250 | this.slowPorts.add(portNumber); | 263 | this.slowPorts.add(portNumber); |
| ... | @@ -274,8 +287,12 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -274,8 +287,12 @@ public class LinkDiscovery implements TimerTask { |
| 274 | } | 287 | } |
| 275 | 288 | ||
| 276 | public void start() { | 289 | public void start() { |
| 277 | - timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS); | 290 | + if (isStopped) { |
| 278 | - isStopped = false; | 291 | + timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS); |
| 292 | + isStopped = false; | ||
| 293 | + } else { | ||
| 294 | + log.warn("LinkDiscovery started multiple times?"); | ||
| 295 | + } | ||
| 279 | } | 296 | } |
| 280 | 297 | ||
| 281 | /** | 298 | /** |
| ... | @@ -317,8 +334,8 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -317,8 +334,8 @@ public class LinkDiscovery implements TimerTask { |
| 317 | } | 334 | } |
| 318 | 335 | ||
| 319 | private void sendProbes(Long portNumber) { | 336 | private void sendProbes(Long portNumber) { |
| 320 | - boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; | 337 | + // TODO: should have suppression port configuration, not by type |
| 321 | - if (isMaster && device.type() != Device.Type.ROADM) { | 338 | + if (device.type() != Device.Type.ROADM) { |
| 322 | log.debug("Sending probes out to {}@{}", portNumber, device.id()); | 339 | log.debug("Sending probes out to {}@{}", portNumber, device.id()); |
| 323 | OutboundPacket pkt = this.createOutBoundLLDP(portNumber); | 340 | OutboundPacket pkt = this.createOutBoundLLDP(portNumber); |
| 324 | pktService.emit(pkt); | 341 | pktService.emit(pkt); | ... | ... |
-
Please register or login to post a comment