Device Mastership
try to fix Masteship recognition mismatch when MastershipEvent suggest different view.
Change-Id: If1aba3d330978c48e8c4053fb47f4d149d57966e
diff --git a/core/net/src/main/java/org/onlab/onos/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onlab/onos/net/device/impl/DeviceManager.java
index 178a1a3..af59abd 100644
--- a/core/net/src/main/java/org/onlab/onos/net/device/impl/DeviceManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/device/impl/DeviceManager.java
@@ -452,6 +452,35 @@
return;
}
applyRole(did, MastershipRole.STANDBY);
+ } else {
+ // Event suggests that this Node has no connection to this Device
+ // confirm.
+ final Device device = getDevice(did);
+ if (!isReachable(device)) {
+ // not connection to device, as expected
+ return;
+ }
+ // connection seems to exist
+ log.info("Detected mastership info mismatch, requesting Role");
+ mastershipService.requestRoleFor(did);
+ final MastershipTerm term = termService.getMastershipTerm(did);
+ if (myNodeId.equals(term.master())) {
+ // became MASTER
+ // TODO: consider slicing out method for applying MASTER role
+ deviceClockProviderService.setMastershipTerm(did, term);
+
+ //flag the device as online. Is there a better way to do this?
+ DeviceEvent devEvent =
+ store.createOrUpdateDevice(device.providerId(), did,
+ new DefaultDeviceDescription(
+ did.uri(), device.type(), device.manufacturer(),
+ device.hwVersion(), device.swVersion(),
+ device.serialNumber(), device.chassisId()));
+ applyRole(did, MastershipRole.MASTER);
+ post(devEvent);
+ } else {
+ applyRole(did, MastershipRole.STANDBY);
+ }
}
}