LLDP LinkDiscovery related fix

- avoid LinkDiscovery from start()-ing multiple times
- Only check device mastership at beginning of probe interval

Change-Id: I0cece8fbcf2a031ea3ac603c6f51dbe87ad454ad
This commit is contained in:
Yuta HIGUCHI 2014-10-29 15:25:51 -07:00
parent c202954953
commit f672588ec4
2 changed files with 24 additions and 6 deletions

View File

@ -145,7 +145,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
break; break;
case PORT_ADDED: case PORT_ADDED:
case PORT_UPDATED: case PORT_UPDATED:
if (event.port().isEnabled()) { if (port.isEnabled()) {
ld = discoverers.get(device.id()); ld = discoverers.get(device.id());
if (ld == null) { if (ld == null) {
return; return;
@ -155,6 +155,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
ld.addPort(port); ld.addPort(port);
} }
} else { } else {
log.debug("Port down {}", port);
ConnectPoint point = new ConnectPoint(device.id(), ConnectPoint point = new ConnectPoint(device.id(),
port.number()); port.number());
providerService.linksVanished(point); providerService.linksVanished(point);

View File

@ -68,6 +68,7 @@ public class LinkDiscovery implements TimerTask {
// send 1 probe every probeRate milliseconds // send 1 probe every probeRate milliseconds
private final long probeRate; private final long probeRate;
private final Set<Long> slowPorts; private final Set<Long> slowPorts;
// ports, known to have incoming links
private final Set<Long> fastPorts; private final Set<Long> fastPorts;
// number of unacknowledged probes per port // number of unacknowledged probes per port
private final Map<Long, AtomicInteger> portProbeCount; private final Map<Long, AtomicInteger> portProbeCount;
@ -125,6 +126,7 @@ public class LinkDiscovery implements TimerTask {
log.info("Using BDDP to discover network"); log.info("Using BDDP to discover network");
} }
this.isStopped = true;
start(); start();
this.log.debug("Started discovery manager for switch {}", this.log.debug("Started discovery manager for switch {}",
device.id()); device.id());
@ -140,7 +142,10 @@ public class LinkDiscovery implements TimerTask {
public void addPort(final Port port) { public void addPort(final Port port) {
this.log.debug("Sending init probe to port {}@{}", this.log.debug("Sending init probe to port {}@{}",
port.number().toLong(), device.id()); port.number().toLong(), device.id());
boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER;
if (isMaster) {
sendProbes(port.number().toLong()); sendProbes(port.number().toLong());
}
synchronized (this) { synchronized (this) {
this.slowPorts.add(port.number().toLong()); this.slowPorts.add(port.number().toLong());
} }
@ -233,6 +238,13 @@ public class LinkDiscovery implements TimerTask {
*/ */
@Override @Override
public void run(final Timeout t) { public void run(final Timeout t) {
boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER;
if (!isMaster) {
// reschedule timer
timeout = Timer.getTimer().newTimeout(this, this.probeRate, MILLISECONDS);
return;
}
this.log.trace("Sending probes from {}", device.id()); this.log.trace("Sending probes from {}", device.id());
synchronized (this) { synchronized (this) {
final Iterator<Long> fastIterator = this.fastPorts.iterator(); final Iterator<Long> fastIterator = this.fastPorts.iterator();
@ -245,6 +257,7 @@ public class LinkDiscovery implements TimerTask {
sendProbes(portNumber); sendProbes(portNumber);
} else { } else {
// Link down, demote to slowPorts
// Update fast and slow ports // Update fast and slow ports
fastIterator.remove(); fastIterator.remove();
this.slowPorts.add(portNumber); this.slowPorts.add(portNumber);
@ -274,8 +287,12 @@ public class LinkDiscovery implements TimerTask {
} }
public void start() { public void start() {
if (isStopped) {
timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS); timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS);
isStopped = false; isStopped = false;
} else {
log.warn("LinkDiscovery started multiple times?");
}
} }
/** /**
@ -317,8 +334,8 @@ public class LinkDiscovery implements TimerTask {
} }
private void sendProbes(Long portNumber) { private void sendProbes(Long portNumber) {
boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; // TODO: should have suppression port configuration, not by type
if (isMaster && device.type() != Device.Type.ROADM) { if (device.type() != Device.Type.ROADM) {
log.debug("Sending probes out to {}@{}", portNumber, device.id()); log.debug("Sending probes out to {}@{}", portNumber, device.id());
OutboundPacket pkt = this.createOutBoundLLDP(portNumber); OutboundPacket pkt = this.createOutBoundLLDP(portNumber);
pktService.emit(pkt); pktService.emit(pkt);