blob: e2a90f44903240a1ad2dda237cdb7a04e85f6b7a [file] [log] [blame]
Madan Jampani7e55c662016-02-15 21:13:53 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Madan Jampani7e55c662016-02-15 21:13:53 -08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.store.cluster.impl;
17
18import static org.slf4j.LoggerFactory.getLogger;
19
20import java.util.Map;
21import java.util.Objects;
22import java.util.function.Consumer;
23
24import org.apache.felix.scr.annotations.Activate;
25import org.apache.felix.scr.annotations.Component;
26import org.apache.felix.scr.annotations.Deactivate;
27import org.apache.felix.scr.annotations.Reference;
28import org.apache.felix.scr.annotations.ReferenceCardinality;
29import org.apache.felix.scr.annotations.Service;
Madan Jampani7e55c662016-02-15 21:13:53 -080030import org.onosproject.cluster.ClusterService;
31import org.onosproject.cluster.Leadership;
32import org.onosproject.cluster.LeadershipEvent;
33import org.onosproject.cluster.LeadershipStore;
34import org.onosproject.cluster.LeadershipStoreDelegate;
35import org.onosproject.cluster.NodeId;
36import org.onosproject.event.Change;
37import org.onosproject.store.AbstractStore;
38import org.onosproject.store.service.LeaderElector;
Madan Jampani7e55c662016-02-15 21:13:53 -080039import org.onosproject.store.service.StorageService;
40import org.slf4j.Logger;
41
42import com.google.common.collect.ImmutableMap;
43import com.google.common.collect.Maps;
44
45/**
46 * Implementation of {@code LeadershipStore} that makes use of a {@link LeaderElector}
47 * primitive.
48 */
49@Service
Madan Jampani1ffa46b2016-04-01 14:34:01 -070050@Component(immediate = true, enabled = true)
Madan Jampani7e55c662016-02-15 21:13:53 -080051public class NewDistributedLeadershipStore
52 extends AbstractStore<LeadershipEvent, LeadershipStoreDelegate>
53 implements LeadershipStore {
54
55 private final Logger log = getLogger(getClass());
56
57 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
58 protected ClusterService clusterService;
59
60 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
61 protected StorageService storageService;
62
63 private NodeId localNodeId;
64 private LeaderElector leaderElector;
65 private final Map<String, Leadership> leaderBoard = Maps.newConcurrentMap();
66
Madan Jampani7e55c662016-02-15 21:13:53 -080067 private final Consumer<Change<Leadership>> leadershipChangeListener =
68 change -> {
69 Leadership oldValue = change.oldValue();
70 Leadership newValue = change.newValue();
71 leaderBoard.put(newValue.topic(), newValue);
72 boolean leaderChanged = !Objects.equals(oldValue.leader(), newValue.leader());
73 boolean candidatesChanged = !Objects.equals(oldValue.candidates(), newValue.candidates());
74 LeadershipEvent.Type eventType = null;
75 if (leaderChanged && candidatesChanged) {
76 eventType = LeadershipEvent.Type.LEADER_AND_CANDIDATES_CHANGED;
77 }
78 if (leaderChanged && !candidatesChanged) {
79 eventType = LeadershipEvent.Type.LEADER_CHANGED;
80 }
81 if (!leaderChanged && candidatesChanged) {
82 eventType = LeadershipEvent.Type.CANDIDATES_CHANGED;
83 }
84 notifyDelegate(new LeadershipEvent(eventType, change.newValue()));
85 };
86
87 @Activate
88 public void activate() {
89 localNodeId = clusterService.getLocalNode().id();
90 leaderElector = storageService.leaderElectorBuilder()
91 .withName("onos-leadership-elections")
92 .build()
93 .asLeaderElector();
94 leaderElector.addChangeListener(leadershipChangeListener);
95 leaderBoard.putAll(getLeaderships());
96 log.info("Started");
97 }
98
99 @Deactivate
100 public void deactivate() {
101 leaderElector.removeChangeListener(leadershipChangeListener);
102 log.info("Stopped");
103 }
104
105 @Override
106 public Leadership addRegistration(String topic) {
Madan Jampani64d37212016-02-25 09:24:54 -0800107 return leaderElector.run(topic, localNodeId);
Madan Jampani7e55c662016-02-15 21:13:53 -0800108 }
109
110 @Override
111 public void removeRegistration(String topic) {
Madan Jampani64d37212016-02-25 09:24:54 -0800112 leaderElector.withdraw(topic);
Madan Jampani7e55c662016-02-15 21:13:53 -0800113 }
114
115 @Override
116 public void removeRegistration(NodeId nodeId) {
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800117 leaderElector.evict(nodeId);
Madan Jampani7e55c662016-02-15 21:13:53 -0800118 }
119
120 @Override
121 public boolean moveLeadership(String topic, NodeId toNodeId) {
122 return leaderElector.anoint(topic, toNodeId);
123 }
124
125 @Override
126 public boolean makeTopCandidate(String topic, NodeId nodeId) {
Madan Jampani0c0cdc62016-02-22 16:54:06 -0800127 return leaderElector.promote(topic, nodeId);
Madan Jampani7e55c662016-02-15 21:13:53 -0800128 }
129
130 @Override
131 public Leadership getLeadership(String topic) {
132 return leaderBoard.get(topic);
133 }
134
135 @Override
136 public Map<String, Leadership> getLeaderships() {
137 return ImmutableMap.copyOf(leaderBoard);
138 }
139}