Convert leadership events directly to mastership events to avoid inconsistencies when building RoleInfo from underlying leadership store
Change-Id: Idfc2b58bb0d90f2a775b02d998ad24b65f076f0b
diff --git a/core/store/dist/src/main/java/org/onosproject/store/mastership/impl/ConsistentDeviceMastershipStore.java b/core/store/dist/src/main/java/org/onosproject/store/mastership/impl/ConsistentDeviceMastershipStore.java
index 8521f52..1b406e7 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/mastership/impl/ConsistentDeviceMastershipStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/mastership/impl/ConsistentDeviceMastershipStore.java
@@ -328,27 +328,33 @@
private void handleEvent(LeadershipEvent event) {
Leadership leadership = event.subject();
DeviceId deviceId = extractDeviceIdFromTopic(leadership.topic());
- RoleInfo roleInfo = event.type() != LeadershipEvent.Type.SERVICE_DISRUPTED ?
- getNodes(deviceId) : new RoleInfo();
+ NodeId master = event.subject().leaderNodeId();
+ List<NodeId> backups = event.subject().candidates()
+ .stream()
+ .filter(n -> !n.equals(master))
+ .collect(Collectors.toList());
+ RoleInfo roleInfo = event.type() != LeadershipEvent.Type.SERVICE_DISRUPTED
+ ? new RoleInfo(master, backups)
+ : new RoleInfo();
switch (event.type()) {
- case LEADER_AND_CANDIDATES_CHANGED:
- notifyDelegate(new MastershipEvent(BACKUPS_CHANGED, deviceId, roleInfo));
- notifyDelegate(new MastershipEvent(MASTER_CHANGED, deviceId, roleInfo));
- break;
- case LEADER_CHANGED:
- notifyDelegate(new MastershipEvent(MASTER_CHANGED, deviceId, roleInfo));
- break;
- case CANDIDATES_CHANGED:
- notifyDelegate(new MastershipEvent(BACKUPS_CHANGED, deviceId, roleInfo));
- break;
- case SERVICE_DISRUPTED:
- notifyDelegate(new MastershipEvent(SUSPENDED, deviceId, roleInfo));
- break;
- case SERVICE_RESTORED:
- // Do nothing, wait for updates from peers
- break;
- default:
- return;
+ case LEADER_AND_CANDIDATES_CHANGED:
+ notifyDelegate(new MastershipEvent(BACKUPS_CHANGED, deviceId, roleInfo));
+ notifyDelegate(new MastershipEvent(MASTER_CHANGED, deviceId, roleInfo));
+ break;
+ case LEADER_CHANGED:
+ notifyDelegate(new MastershipEvent(MASTER_CHANGED, deviceId, roleInfo));
+ break;
+ case CANDIDATES_CHANGED:
+ notifyDelegate(new MastershipEvent(BACKUPS_CHANGED, deviceId, roleInfo));
+ break;
+ case SERVICE_DISRUPTED:
+ notifyDelegate(new MastershipEvent(SUSPENDED, deviceId, roleInfo));
+ break;
+ case SERVICE_RESTORED:
+ // Do nothing, wait for updates from peers
+ break;
+ default:
+ return;
}
}
}