Cleanup local maps in LldpLinkProvider
- Clear local last seen link times when disabled
- Clear maps of devices/ports we are not master of
- Fix sonar issues
Change-Id: I1a6670204dfa49893236e32388ddfa9c87a9a8ad
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
index e6f48fb..f7eda45 100644
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
+++ b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
@@ -17,6 +17,8 @@
import java.util.Dictionary;
import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
@@ -369,6 +371,7 @@
}
discoverers.values().forEach(LinkDiscovery::stop);
discoverers.clear();
+ linkTimes.clear();
providerService = null;
}
@@ -422,6 +425,19 @@
if (device == null) {
return Optional.empty();
}
+ if (!masterService.isLocalMaster(device.id())) {
+ // Reset the last seen time for all links to this device
+ // then stop discovery for this device
+ List<LinkKey> updateLinks = new LinkedList<>();
+ linkTimes.forEach((link, time) -> {
+ if (link.dst().deviceId().equals(device.id())) {
+ updateLinks.add(link);
+ }
+ });
+ updateLinks.forEach(link -> linkTimes.remove(link));
+ removeDevice(device.id());
+ return Optional.empty();
+ }
if (rules.isSuppressed(device) || isBlacklisted(device.id())) {
log.trace("LinkDiscovery from {} disabled by configuration", device.id());
removeDevice(device.id());
@@ -797,21 +813,32 @@
updateRules(newRules);
}
+ private boolean isRelevantDeviceEvent(NetworkConfigEvent event) {
+ return event.configClass() == LinkDiscoveryFromDevice.class &&
+ CONFIG_CHANGED.contains(event.type());
+ }
+
+ private boolean isRelevantPortEvent(NetworkConfigEvent event) {
+ return event.configClass() == LinkDiscoveryFromPort.class &&
+ CONFIG_CHANGED.contains(event.type());
+ }
+
+ private boolean isRelevantSuppressionEvent(NetworkConfigEvent event) {
+ return (event.configClass().equals(SuppressionConfig.class) &&
+ (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
+ event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED));
+ }
+
@Override
public void event(NetworkConfigEvent event) {
eventExecutor.execute(() -> {
- if (event.configClass() == LinkDiscoveryFromDevice.class &&
- CONFIG_CHANGED.contains(event.type())) {
-
+ if (isRelevantDeviceEvent(event)) {
if (event.subject() instanceof DeviceId) {
final DeviceId did = (DeviceId) event.subject();
Device device = deviceService.getDevice(did);
updateDevice(device).ifPresent(ld -> updatePorts(ld, did));
}
-
- } else if (event.configClass() == LinkDiscoveryFromPort.class &&
- CONFIG_CHANGED.contains(event.type())) {
-
+ } else if (isRelevantPortEvent(event)) {
if (event.subject() instanceof ConnectPoint) {
ConnectPoint cp = (ConnectPoint) event.subject();
if (cp.elementId() instanceof DeviceId) {
@@ -821,10 +848,7 @@
updateDevice(device).ifPresent(ld -> updatePort(ld, port));
}
}
-
- } else if (event.configClass().equals(SuppressionConfig.class) &&
- (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
- event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) {
+ } else if (isRelevantSuppressionEvent(event)) {
SuppressionConfig cfg = cfgRegistry.getConfig(appId, SuppressionConfig.class);
reconfigureSuppressionRules(cfg);
log.trace("Network config reconfigured");