Fixed some bugs
- Update br-int rather than do nothing if it already exists
- Make only the leader performs node bootstrap
- Check mastership on HOST event not flow rule populator
- Install/uninstall flow rules for vSG always from master, or the rules
stay in PENDING_ADDED state
Change-Id: I4bd5cf6f84bf36f2617288b2d843435819c76ba8
diff --git a/src/main/java/org/onosproject/cordvtn/CordVtnNodeManager.java b/src/main/java/org/onosproject/cordvtn/CordVtnNodeManager.java
index d4aceeb..bcd76bc 100644
--- a/src/main/java/org/onosproject/cordvtn/CordVtnNodeManager.java
+++ b/src/main/java/org/onosproject/cordvtn/CordVtnNodeManager.java
@@ -27,9 +27,10 @@
import org.onlab.util.ItemNotFoundException;
import org.onlab.util.KryoNamespace;
import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.LeadershipService;
+import org.onosproject.cluster.NodeId;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
-import org.onosproject.mastership.MastershipService;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.Device;
@@ -70,6 +71,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
@@ -149,7 +151,7 @@
protected FlowRuleService flowRuleService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected MastershipService mastershipService;
+ protected LeadershipService leadershipService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected GroupService groupService;
@@ -169,6 +171,7 @@
private ConsistentMap<String, CordVtnNode> nodeStore;
private CordVtnRuleInstaller ruleInstaller;
private ApplicationId appId;
+ private NodeId localNodeId;
private enum NodeState implements CordVtnNodeState {
@@ -217,6 +220,9 @@
@Activate
protected void active() {
appId = coreService.getAppId(CordVtnService.CORDVTN_APP_ID);
+ localNodeId = clusterService.getLocalNode().id();
+ leadershipService.runForLeadership(appId.name());
+
nodeStore = storageService.<String, CordVtnNode>consistentMapBuilder()
.withSerializer(Serializer.using(NODE_SERIALIZER.build()))
.withName("cordvtn-nodestore")
@@ -227,7 +233,6 @@
deviceService,
driverService,
groupService,
- mastershipService,
DEFAULT_TUNNEL);
deviceService.addListener(deviceListener);
@@ -242,6 +247,7 @@
eventExecutor.shutdown();
nodeStore.clear();
+ leadershipService.withdraw(appId.name());
}
/**
@@ -285,6 +291,13 @@
return;
}
+ NodeId leaderNodeId = leadershipService.getLeader(appId.name());
+ log.debug("Node init requested, local: {} leader: {}", localNodeId, leaderNodeId);
+ if (!Objects.equals(localNodeId, leaderNodeId)) {
+ // only the leader performs node init
+ return;
+ }
+
NodeState state = getNodeState(node);
log.debug("Init node: {} state: {}", node.hostname(), state.toString());
state.process(this, node);
@@ -839,6 +852,12 @@
@Override
public void event(DeviceEvent event) {
+ NodeId leaderNodeId = leadershipService.getLeader(appId.name());
+ if (!Objects.equals(localNodeId, leaderNodeId)) {
+ // only the leader processes events
+ return;
+ }
+
Device device = event.subject();
ConnectionHandler<Device> handler =
(device.type().equals(SWITCH) ? bridgeHandler : ovsdbHandler);