Committed by
Madan Jampani
Create local storage for topic candidates mapping. This also includes:
- using Optional in Leadership, and some commenting.
- using MutableBooleans + compute()
part of: Device Mastership store on top of LeadershipService
Reference: ONOS-76
Conflicts:
core/api/src/main/java/org/onosproject/cluster/LeadershipService.java
core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DistributedLeadershipManager.java
Change-Id: I7f090abb123cf23bb5126a935a6e72be00f3e3ce
Showing
8 changed files
with
30 additions
and
17 deletions
| ... | @@ -85,7 +85,7 @@ public class LeaderCommand extends AbstractShellCommand { | ... | @@ -85,7 +85,7 @@ public class LeaderCommand extends AbstractShellCommand { |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | private void displayCandidates(Map<String, Leadership> leaderBoard, | 87 | private void displayCandidates(Map<String, Leadership> leaderBoard, |
| 88 | - Map<String, List<NodeId>> candidates) { | 88 | + Map<String, Leadership> candidates) { |
| 89 | print("--------------------------------------------------------------"); | 89 | print("--------------------------------------------------------------"); |
| 90 | print(FMT_C, "Topic", "Leader", "Candidates"); | 90 | print(FMT_C, "Topic", "Leader", "Candidates"); |
| 91 | print("--------------------------------------------------------------"); | 91 | print("--------------------------------------------------------------"); |
| ... | @@ -94,13 +94,13 @@ public class LeaderCommand extends AbstractShellCommand { | ... | @@ -94,13 +94,13 @@ public class LeaderCommand extends AbstractShellCommand { |
| 94 | .stream() | 94 | .stream() |
| 95 | .sorted(leadershipComparator) | 95 | .sorted(leadershipComparator) |
| 96 | .forEach(l -> { | 96 | .forEach(l -> { |
| 97 | - List<NodeId> list = candidates.get(l.topic()); | 97 | + List<NodeId> list = candidates.get(l.topic()).candidates(); |
| 98 | print(FMT_C, | 98 | print(FMT_C, |
| 99 | l.topic(), | 99 | l.topic(), |
| 100 | l.leader(), | 100 | l.leader(), |
| 101 | - list.remove(0).toString()); | 101 | + list.get(0).toString()); |
| 102 | // formatting hacks to get it into a table | 102 | // formatting hacks to get it into a table |
| 103 | - list.forEach(n -> print(FMT_C, " ", " ", n)); | 103 | + list.subList(1, list.size()).forEach(n -> print(FMT_C, " ", " ", n)); |
| 104 | print(FMT_C, " ", " ", " "); | 104 | print(FMT_C, " ", " ", " "); |
| 105 | }); | 105 | }); |
| 106 | print("--------------------------------------------------------------"); | 106 | print("--------------------------------------------------------------"); |
| ... | @@ -139,7 +139,7 @@ public class LeaderCommand extends AbstractShellCommand { | ... | @@ -139,7 +139,7 @@ public class LeaderCommand extends AbstractShellCommand { |
| 139 | print("%s", json(leaderBoard)); | 139 | print("%s", json(leaderBoard)); |
| 140 | } else { | 140 | } else { |
| 141 | if (showCandidates) { | 141 | if (showCandidates) { |
| 142 | - Map<String, List<NodeId>> candidates = leaderService.getCandidates(); | 142 | + Map<String, Leadership> candidates = leaderService.getCandidates(); |
| 143 | displayCandidates(leaderBoard, candidates); | 143 | displayCandidates(leaderBoard, candidates); |
| 144 | } else { | 144 | } else { |
| 145 | displayLeaders(leaderBoard); | 145 | displayLeaders(leaderBoard); | ... | ... |
| ... | @@ -17,6 +17,7 @@ package org.onosproject.cluster; | ... | @@ -17,6 +17,7 @@ package org.onosproject.cluster; |
| 17 | 17 | ||
| 18 | import java.util.Objects; | 18 | import java.util.Objects; |
| 19 | import java.util.List; | 19 | import java.util.List; |
| 20 | +import java.util.Optional; | ||
| 20 | 21 | ||
| 21 | import org.joda.time.DateTime; | 22 | import org.joda.time.DateTime; |
| 22 | 23 | ||
| ... | @@ -33,19 +34,21 @@ import com.google.common.collect.ImmutableList; | ... | @@ -33,19 +34,21 @@ import com.google.common.collect.ImmutableList; |
| 33 | * rest in decreasing preference order.</li> | 34 | * rest in decreasing preference order.</li> |
| 34 | * <li>The epoch is the logical age of a Leadership construct, and should be | 35 | * <li>The epoch is the logical age of a Leadership construct, and should be |
| 35 | * used for comparing two Leaderships, but only of the same topic.</li> | 36 | * used for comparing two Leaderships, but only of the same topic.</li> |
| 37 | + * <li>The leader may be null if its accuracy can't be guaranteed. This applies | ||
| 38 | + * to CANDIDATES_CHANGED events and candidate board contents.</li> | ||
| 36 | * </ul> | 39 | * </ul> |
| 37 | */ | 40 | */ |
| 38 | public class Leadership { | 41 | public class Leadership { |
| 39 | 42 | ||
| 40 | private final String topic; | 43 | private final String topic; |
| 41 | - private final NodeId leader; | 44 | + private final Optional<NodeId> leader; |
| 42 | private final List<NodeId> candidates; | 45 | private final List<NodeId> candidates; |
| 43 | private final long epoch; | 46 | private final long epoch; |
| 44 | private final long electedTime; | 47 | private final long electedTime; |
| 45 | 48 | ||
| 46 | public Leadership(String topic, NodeId leader, long epoch, long electedTime) { | 49 | public Leadership(String topic, NodeId leader, long epoch, long electedTime) { |
| 47 | this.topic = topic; | 50 | this.topic = topic; |
| 48 | - this.leader = leader; | 51 | + this.leader = Optional.of(leader); |
| 49 | this.candidates = ImmutableList.of(leader); | 52 | this.candidates = ImmutableList.of(leader); |
| 50 | this.epoch = epoch; | 53 | this.epoch = epoch; |
| 51 | this.electedTime = electedTime; | 54 | this.electedTime = electedTime; |
| ... | @@ -54,7 +57,16 @@ public class Leadership { | ... | @@ -54,7 +57,16 @@ public class Leadership { |
| 54 | public Leadership(String topic, NodeId leader, List<NodeId> candidates, | 57 | public Leadership(String topic, NodeId leader, List<NodeId> candidates, |
| 55 | long epoch, long electedTime) { | 58 | long epoch, long electedTime) { |
| 56 | this.topic = topic; | 59 | this.topic = topic; |
| 57 | - this.leader = leader; | 60 | + this.leader = Optional.of(leader); |
| 61 | + this.candidates = ImmutableList.copyOf(candidates); | ||
| 62 | + this.epoch = epoch; | ||
| 63 | + this.electedTime = electedTime; | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + public Leadership(String topic, List<NodeId> candidates, | ||
| 67 | + long epoch, long electedTime) { | ||
| 68 | + this.topic = topic; | ||
| 69 | + this.leader = Optional.empty(); | ||
| 58 | this.candidates = ImmutableList.copyOf(candidates); | 70 | this.candidates = ImmutableList.copyOf(candidates); |
| 59 | this.epoch = epoch; | 71 | this.epoch = epoch; |
| 60 | this.electedTime = electedTime; | 72 | this.electedTime = electedTime; |
| ... | @@ -74,8 +86,9 @@ public class Leadership { | ... | @@ -74,8 +86,9 @@ public class Leadership { |
| 74 | * | 86 | * |
| 75 | * @return leader node. | 87 | * @return leader node. |
| 76 | */ | 88 | */ |
| 89 | + // This will return Optional<NodeId> in the future. | ||
| 77 | public NodeId leader() { | 90 | public NodeId leader() { |
| 78 | - return leader; | 91 | + return leader.orElse(null); |
| 79 | } | 92 | } |
| 80 | 93 | ||
| 81 | /** | 94 | /** | ... | ... |
| ... | @@ -43,14 +43,14 @@ public class LeadershipEvent extends AbstractEvent<LeadershipEvent.Type, Leaders | ... | @@ -43,14 +43,14 @@ public class LeadershipEvent extends AbstractEvent<LeadershipEvent.Type, Leaders |
| 43 | LEADER_REELECTED, | 43 | LEADER_REELECTED, |
| 44 | 44 | ||
| 45 | /** | 45 | /** |
| 46 | - * Signifies that the leader has been booted and lost leadership. The event subject is the | 46 | + * Signifies that the leader has been booted and lost leadership. The |
| 47 | - * former leader. | 47 | + * event subject is the former leader. |
| 48 | */ | 48 | */ |
| 49 | LEADER_BOOTED, | 49 | LEADER_BOOTED, |
| 50 | 50 | ||
| 51 | /** | 51 | /** |
| 52 | * Signifies that the list of candidates for leadership for a topic has | 52 | * Signifies that the list of candidates for leadership for a topic has |
| 53 | - * changed. | 53 | + * changed. This event does not guarantee accurate leader information. |
| 54 | */ | 54 | */ |
| 55 | CANDIDATES_CHANGED | 55 | CANDIDATES_CHANGED |
| 56 | } | 56 | } | ... | ... |
| ... | @@ -76,9 +76,9 @@ public interface LeadershipService { | ... | @@ -76,9 +76,9 @@ public interface LeadershipService { |
| 76 | /** | 76 | /** |
| 77 | * Returns the candidates for all known topics. | 77 | * Returns the candidates for all known topics. |
| 78 | * | 78 | * |
| 79 | - * @return A map of topics to lists of NodeIds. | 79 | + * @return A mapping from topics to up-to-date candidate info. |
| 80 | */ | 80 | */ |
| 81 | - Map<String, List<NodeId>> getCandidates(); | 81 | + Map<String, Leadership> getCandidates(); |
| 82 | 82 | ||
| 83 | /** | 83 | /** |
| 84 | * Returns the candidates for a given topic. | 84 | * Returns the candidates for a given topic. | ... | ... |
| ... | @@ -65,7 +65,7 @@ public class LeadershipServiceAdapter implements LeadershipService { | ... | @@ -65,7 +65,7 @@ public class LeadershipServiceAdapter implements LeadershipService { |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | @Override | 67 | @Override |
| 68 | - public Map<String, List<NodeId>> getCandidates() { | 68 | + public Map<String, Leadership> getCandidates() { |
| 69 | return null; | 69 | return null; |
| 70 | } | 70 | } |
| 71 | 71 | ... | ... |
| ... | @@ -576,7 +576,7 @@ public class HazelcastLeadershipService implements LeadershipService { | ... | @@ -576,7 +576,7 @@ public class HazelcastLeadershipService implements LeadershipService { |
| 576 | } | 576 | } |
| 577 | 577 | ||
| 578 | @Override | 578 | @Override |
| 579 | - public Map<String, List<NodeId>> getCandidates() { | 579 | + public Map<String, Leadership> getCandidates() { |
| 580 | return null; | 580 | return null; |
| 581 | } | 581 | } |
| 582 | 582 | ... | ... |
This diff is collapsed. Click to expand it.
| ... | @@ -111,7 +111,7 @@ public class SimpleLeadershipManager implements LeadershipService { | ... | @@ -111,7 +111,7 @@ public class SimpleLeadershipManager implements LeadershipService { |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | @Override | 113 | @Override |
| 114 | - public Map<String, List<NodeId>> getCandidates() { | 114 | + public Map<String, Leadership> getCandidates() { |
| 115 | return null; | 115 | return null; |
| 116 | } | 116 | } |
| 117 | 117 | ... | ... |
-
Please register or login to post a comment