fixed #229: handling rapid switch flapping race conditions gracefully
diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
index 60dbc69..f4a6263 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
@@ -560,7 +560,9 @@
removeSwitch(sw);
}
synchronized(roleChanger) {
- registryService.releaseControl(sw.getId());
+ if (controlRequested) {
+ registryService.releaseControl(sw.getId());
+ }
connectedSwitches.remove(sw);
}
sw.setConnected(false);
@@ -795,9 +797,10 @@
dfuture);
}
-
+
+ volatile Boolean controlRequested = Boolean.FALSE;
protected void checkSwitchReady() {
- Boolean controlRequested = Boolean.TRUE;
+
if (state.hsState == HandshakeState.FEATURES_REPLY &&
state.hasDescription && state.hasGetConfigReply) {
@@ -822,6 +825,7 @@
//Request control of the switch from the global registry
try {
+ controlRequested = Boolean.TRUE;
registryService.requestControl(sw.getId(),
new RoleChangeCallback());
} catch (RegistryException e) {
diff --git a/src/main/java/net/onrc/onos/registry/controller/ZookeeperRegistry.java b/src/main/java/net/onrc/onos/registry/controller/ZookeeperRegistry.java
index 0895e44..e587b0f 100644
--- a/src/main/java/net/onrc/onos/registry/controller/ZookeeperRegistry.java
+++ b/src/main/java/net/onrc/onos/registry/controller/ZookeeperRegistry.java
@@ -158,7 +158,7 @@
if (switches.get(dpidStr) != null){
log.debug("Already contesting {}, returning", HexString.toHexString(dpid));
- throw new RegistryException("Already requested control for " + dpidStr);
+ throw new RegistryException("Already contesting control for " + dpidStr);
}
LeaderLatch latch = new LeaderLatch(client, latchPath, controllerId);