Distributed group store using eventual consistent map abstraction
Change-Id: I618a0f6fa80e0e25285d7a2026032f09ba90aa70
diff --git a/apps/grouphandler/src/main/java/org/onosproject/grouphandler/DefaultGroupHandlerApp.java b/apps/grouphandler/src/main/java/org/onosproject/grouphandler/DefaultGroupHandlerApp.java
index 2bd2b4e..bb1a035 100644
--- a/apps/grouphandler/src/main/java/org/onosproject/grouphandler/DefaultGroupHandlerApp.java
+++ b/apps/grouphandler/src/main/java/org/onosproject/grouphandler/DefaultGroupHandlerApp.java
@@ -17,8 +17,10 @@
import static org.slf4j.LoggerFactory.getLogger;
+import java.net.URI;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import org.apache.felix.scr.annotations.Activate;
@@ -27,10 +29,13 @@
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onlab.packet.MacAddress;
+import org.onlab.util.KryoNamespace;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
+import org.onosproject.mastership.MastershipService;
import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
+import org.onosproject.net.MastershipRole;
import org.onosproject.net.device.DeviceEvent;
import org.onosproject.net.device.DeviceListener;
import org.onosproject.net.device.DeviceService;
@@ -69,10 +74,18 @@
protected GroupService groupService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected CoreService coreService;
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected MastershipService mastershipService;
private DeviceListener deviceListener = new InternalDeviceListener();
private LinkListener linkListener = new InternalLinkListener();
+ protected KryoNamespace.Builder kryo = new KryoNamespace.Builder()
+ .register(URI.class)
+ .register(HashSet.class)
+ .register(DeviceId.class)
+ .register(NeighborSet.class);
+
@Activate
public void activate() {
appId = coreService.registerApplication("org.onosproject.defaultgrouphandler");
@@ -80,14 +93,23 @@
deviceService.addListener(deviceListener);
linkService.addListener(linkListener);
for (Device device: deviceService.getDevices()) {
- log.debug("Initiating default group handling for {}", device.id());
- DefaultGroupHandler dgh = DefaultGroupHandler.createGroupHandler(device.id(),
- appId,
- config,
- linkService,
- groupService);
- dgh.createGroups();
- dghMap.put(device.id(), dgh);
+ if (mastershipService.
+ getLocalRole(device.id()) == MastershipRole.MASTER) {
+ log.debug("Initiating default group handling for {}", device.id());
+ DefaultGroupHandler dgh = DefaultGroupHandler.createGroupHandler(device.id(),
+ appId,
+ config,
+ linkService,
+ groupService);
+ dgh.createGroups();
+ dghMap.put(device.id(), dgh);
+ } else {
+ log.debug("Activate: Local role {} "
+ + "is not MASTER for device {}",
+ mastershipService.
+ getLocalRole(device.id()),
+ device.id());
+ }
}
log.info("Activated");
}
@@ -165,7 +187,15 @@
@Override
public void event(DeviceEvent event) {
- switch (event.type()) {
+ if (mastershipService.
+ getLocalRole(event.subject().id()) != MastershipRole.MASTER) {
+ log.debug("Local role {} is not MASTER for device {}",
+ mastershipService.
+ getLocalRole(event.subject().id()),
+ event.subject().id());
+ return;
+ }
+ switch (event.type()) {
case DEVICE_ADDED:
log.debug("Initiating default group handling for {}", event.subject().id());
DefaultGroupHandler dgh = DefaultGroupHandler.createGroupHandler(
@@ -193,6 +223,16 @@
@Override
public void event(LinkEvent event) {
+ if (mastershipService.
+ getLocalRole(event.subject().src().deviceId()) !=
+ MastershipRole.MASTER) {
+ log.debug("InternalLinkListener: Local role {} "
+ + "is not MASTER for device {}",
+ mastershipService.
+ getLocalRole(event.subject().src().deviceId()),
+ event.subject().src().deviceId());
+ return;
+ }
switch (event.type()) {
case LINK_ADDED:
if (dghMap.get(event.subject().src().deviceId()) != null) {