Fixed issue with leaking various switch-related collectors, e.g. port stats, meters, table stats, flow stats.
Change-Id: If46102708fa88cf5f251a18cb9ce09393fb95752
diff --git a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
index bd4ecc0..c87c93b 100644
--- a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -180,6 +180,7 @@
controller.removeListener(listener);
providerRegistry.unregister(this);
collectors.values().forEach(PortStatsCollector::stop);
+ collectors.clear();
providerService = null;
LOG.info("Stopped");
}
@@ -374,10 +375,9 @@
providerService.deviceConnected(did, description);
providerService.updatePorts(did, buildPortDescriptions(sw));
- PortStatsCollector psc =
- new PortStatsCollector(sw, portStatsPollFrequency);
+ PortStatsCollector psc = new PortStatsCollector(sw, portStatsPollFrequency);
+ stopCollectorIfNeeded(collectors.put(dpid, psc));
psc.start();
- collectors.put(dpid, psc);
//figure out race condition for collectors.remove() and collectors.put()
if (controller.getSwitch(dpid) == null) {
@@ -385,17 +385,19 @@
}
}
+ private void stopCollectorIfNeeded(PortStatsCollector collector) {
+ if (collector != null) {
+ collector.stop();
+ }
+ }
+
@Override
public void switchRemoved(Dpid dpid) {
if (providerService == null) {
return;
}
providerService.deviceDisconnected(deviceId(uri(dpid)));
-
- PortStatsCollector collector = collectors.remove(dpid);
- if (collector != null) {
- collector.stop();
- }
+ stopCollectorIfNeeded(collectors.remove(dpid));
}
@Override