[ONOS-7279] Fix for illegal state exception when deactivating driver providers
Change-Id: I9a8c16e33cac40b91c2b6f405e66f94bcdf5e0e0
(cherry picked from commit 5a3c09c9b9b4edcb926fa3ac400fc1a0e0bc6a4b)
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
index c058ab6..abda2bf 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleDriverProvider.java
@@ -104,6 +104,15 @@
pollFrequency, TimeUnit.SECONDS);
}
+ void terminate() {
+ deviceService.removeListener(deviceListener);
+ deviceService = null;
+ providerService = null;
+ mastershipService = null;
+ poller.cancel(true);
+ executor.shutdown();
+ }
+
@Override
public void applyFlowRule(FlowRule... flowRules) {
rulesByDevice(flowRules).asMap().forEach(this::applyFlowRules);
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
index 47623a7..994303e 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
@@ -165,6 +165,7 @@
@Deactivate
public void deactivate() {
+ driverProvider.terminate();
deviceService.removeListener(deviceListener);
cfgService.unregisterProperties(getClass(), false);
deviceInstallers.shutdownNow();
diff --git a/core/net/src/main/java/org/onosproject/net/group/impl/GroupDriverProvider.java b/core/net/src/main/java/org/onosproject/net/group/impl/GroupDriverProvider.java
index 6eea583..f86e4a1 100644
--- a/core/net/src/main/java/org/onosproject/net/group/impl/GroupDriverProvider.java
+++ b/core/net/src/main/java/org/onosproject/net/group/impl/GroupDriverProvider.java
@@ -99,6 +99,15 @@
}
+ void terminate() {
+ deviceService.removeListener(deviceListener);
+ deviceService = null;
+ groupProviderService = null;
+ mastershipService = null;
+ poller.cancel(true);
+ executor.shutdown();
+ }
+
@Override
public void performGroupOperation(DeviceId deviceId, GroupOperations groupOps) {
GroupProgrammable programmable = getGroupProgrammable(deviceId);
diff --git a/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java b/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
index 9b82f5f..c78108c 100644
--- a/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
+++ b/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
@@ -120,6 +120,7 @@
@Deactivate
public void deactivate() {
+ defaultProvider.terminate();
deviceService.removeListener(deviceListener);
cfgService.unregisterProperties(getClass(), false);
store.unsetDelegate(delegate);