mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-24 13:51:27 +02:00
ONOS-1981: Move expensive work off of event loop thread
Change-Id: I200d9b727a7d501d5b055574ddb0907b8f4756a2
This commit is contained in:
parent
7d02c081cd
commit
328371db2d
@ -613,56 +613,66 @@ public class DeviceManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleMastershipEvent(MastershipEvent event) {
|
||||||
|
if (event.type() != MastershipEvent.Type.MASTER_CHANGED) {
|
||||||
|
// Don't care if backup list changed.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final DeviceId did = event.subject();
|
||||||
|
|
||||||
|
// myRole suggested by MastershipService
|
||||||
|
MastershipRole myNextRole;
|
||||||
|
if (localNodeId.equals(event.roleInfo().master())) {
|
||||||
|
// confirm latest info
|
||||||
|
MastershipTerm term = termService.getMastershipTerm(did);
|
||||||
|
final boolean iHaveControl = term != null && localNodeId.equals(term.master());
|
||||||
|
if (iHaveControl) {
|
||||||
|
deviceClockProviderService.setMastershipTerm(did, term);
|
||||||
|
myNextRole = MASTER;
|
||||||
|
} else {
|
||||||
|
myNextRole = STANDBY;
|
||||||
|
}
|
||||||
|
} else if (event.roleInfo().backups().contains(localNodeId)) {
|
||||||
|
myNextRole = STANDBY;
|
||||||
|
} else {
|
||||||
|
myNextRole = NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
final boolean isReachable = isReachable(did);
|
||||||
|
if (!isReachable) {
|
||||||
|
// device is not connected to this node
|
||||||
|
if (myNextRole != NONE) {
|
||||||
|
log.warn("Node was instructed to be {} role for {}, "
|
||||||
|
+ "but this node cannot reach the device. "
|
||||||
|
+ "Relinquishing role. ",
|
||||||
|
myNextRole, did);
|
||||||
|
mastershipService.relinquishMastership(did);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// device is connected to this node:
|
||||||
|
if (store.getDevice(did) != null) {
|
||||||
|
reassertRole(did, myNextRole);
|
||||||
|
} else {
|
||||||
|
log.debug("Device is not yet/no longer in the store: {}", did);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Intercepts mastership events
|
// Intercepts mastership events
|
||||||
private class InternalMastershipListener implements MastershipListener {
|
private class InternalMastershipListener implements MastershipListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void event(MastershipEvent event) {
|
public void event(MastershipEvent event) {
|
||||||
if (event.type() != MastershipEvent.Type.MASTER_CHANGED) {
|
backgroundService.submit(() -> {
|
||||||
// Don't care if backup list changed.
|
try {
|
||||||
return;
|
handleMastershipEvent(event);
|
||||||
}
|
} catch (Exception e) {
|
||||||
|
log.warn("Failed to handle {}", event, e);
|
||||||
final DeviceId did = event.subject();
|
|
||||||
|
|
||||||
// myRole suggested by MastershipService
|
|
||||||
MastershipRole myNextRole;
|
|
||||||
if (localNodeId.equals(event.roleInfo().master())) {
|
|
||||||
// confirm latest info
|
|
||||||
MastershipTerm term = termService.getMastershipTerm(did);
|
|
||||||
final boolean iHaveControl = term != null && localNodeId.equals(term.master());
|
|
||||||
if (iHaveControl) {
|
|
||||||
deviceClockProviderService.setMastershipTerm(did, term);
|
|
||||||
myNextRole = MASTER;
|
|
||||||
} else {
|
|
||||||
myNextRole = STANDBY;
|
|
||||||
}
|
}
|
||||||
} else if (event.roleInfo().backups().contains(localNodeId)) {
|
});
|
||||||
myNextRole = STANDBY;
|
|
||||||
} else {
|
|
||||||
myNextRole = NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
final boolean isReachable = isReachable(did);
|
|
||||||
if (!isReachable) {
|
|
||||||
// device is not connected to this node
|
|
||||||
if (myNextRole != NONE) {
|
|
||||||
log.warn("Node was instructed to be {} role for {}, "
|
|
||||||
+ "but this node cannot reach the device. "
|
|
||||||
+ "Relinquishing role. ",
|
|
||||||
myNextRole, did);
|
|
||||||
mastershipService.relinquishMastership(did);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// device is connected to this node:
|
|
||||||
if (store.getDevice(did) != null) {
|
|
||||||
reassertRole(did, myNextRole);
|
|
||||||
} else {
|
|
||||||
log.debug("Device is not yet/no longer in the store: {}", did);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user