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/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
index 8998a99..a3a0738 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
@@ -131,7 +131,6 @@
// NewAdaptiveFlowStatsCollector Set
private final Map<Dpid, NewAdaptiveFlowStatsCollector> afsCollectors = Maps.newHashMap();
- private final Map<Dpid, FlowStatsCollector> collectors = Maps.newHashMap();
private final Map<Dpid, TableStatisticsCollector> tableStatsCollectors = Maps.newHashMap();
/**
@@ -142,7 +141,7 @@
}
@Activate
- public void activate(ComponentContext context) {
+ protected void activate(ComponentContext context) {
cfgService.registerProperties(getClass());
providerService = providerRegistry.register(this);
controller.addListener(listener);
@@ -159,7 +158,7 @@
}
@Deactivate
- public void deactivate(ComponentContext context) {
+ protected void deactivate(ComponentContext context) {
cfgService.unregisterProperties(getClass(), false);
stopCollectors();
providerRegistry.unregister(this);
@@ -169,7 +168,7 @@
}
@Modified
- public void modified(ComponentContext context) {
+ protected void modified(ComponentContext context) {
Dictionary<?, ?> properties = context.getProperties();
int newFlowPollFrequency;
try {
@@ -223,15 +222,21 @@
NewAdaptiveFlowStatsCollector fsc =
new NewAdaptiveFlowStatsCollector(driverService, sw, flowPollFrequency);
fsc.start();
- afsCollectors.put(new Dpid(sw.getId()), fsc);
+ stopCollectorIfNeeded(afsCollectors.put(new Dpid(sw.getId()), fsc));
} else {
FlowStatsCollector fsc = new FlowStatsCollector(timer, sw, flowPollFrequency);
fsc.start();
- simpleCollectors.put(new Dpid(sw.getId()), fsc);
+ stopCollectorIfNeeded(simpleCollectors.put(new Dpid(sw.getId()), fsc));
}
TableStatisticsCollector tsc = new TableStatisticsCollector(timer, sw, flowPollFrequency);
tsc.start();
- tableStatsCollectors.put(new Dpid(sw.getId()), tsc);
+ stopCollectorIfNeeded(tableStatsCollectors.put(new Dpid(sw.getId()), tsc));
+ }
+
+ private void stopCollectorIfNeeded(SwitchDataCollector collector) {
+ if (collector != null) {
+ collector.stop();
+ }
}
private void stopCollectors() {
@@ -398,29 +403,17 @@
@Override
public void switchAdded(Dpid dpid) {
-
- OpenFlowSwitch sw = controller.getSwitch(dpid);
-
createCollector(controller.getSwitch(dpid));
}
@Override
public void switchRemoved(Dpid dpid) {
if (adaptiveFlowSampling) {
- NewAdaptiveFlowStatsCollector collector = afsCollectors.remove(dpid);
- if (collector != null) {
- collector.stop();
- }
+ stopCollectorIfNeeded(afsCollectors.remove(dpid));
} else {
- FlowStatsCollector collector = simpleCollectors.remove(dpid);
- if (collector != null) {
- collector.stop();
- }
+ stopCollectorIfNeeded(simpleCollectors.remove(dpid));
}
- TableStatisticsCollector tsc = tableStatsCollectors.remove(dpid);
- if (tsc != null) {
- tsc.stop();
- }
+ stopCollectorIfNeeded(tableStatsCollectors.remove(dpid));
}
@Override