Publish a list of changes when leadership changes occur
Change-Id: I99a4e239ac5aa9999b3a735cdf004941a5957a93
Showing
2 changed files
with
17 additions
and
53 deletions
| ... | @@ -291,17 +291,14 @@ public final class AtomixLeaderElectorCommands { | ... | @@ -291,17 +291,14 @@ public final class AtomixLeaderElectorCommands { |
| 291 | } | 291 | } |
| 292 | 292 | ||
| 293 | /** | 293 | /** |
| 294 | - * Command for administratively anointing a node as leader. | 294 | + * Command for administratively changing the leadership state for a node. |
| 295 | */ | 295 | */ |
| 296 | @SuppressWarnings("serial") | 296 | @SuppressWarnings("serial") |
| 297 | - public static class Anoint extends ElectionCommand<Boolean> { | 297 | + public abstract static class ElectionChangeCommand<V> extends ElectionCommand<V> { |
| 298 | private String topic; | 298 | private String topic; |
| 299 | private NodeId nodeId; | 299 | private NodeId nodeId; |
| 300 | 300 | ||
| 301 | - public Anoint() { | 301 | + public ElectionChangeCommand(String topic, NodeId nodeId) { |
| 302 | - } | ||
| 303 | - | ||
| 304 | - public Anoint(String topic, NodeId nodeId) { | ||
| 305 | this.topic = topic; | 302 | this.topic = topic; |
| 306 | this.nodeId = nodeId; | 303 | this.nodeId = nodeId; |
| 307 | } | 304 | } |
| ... | @@ -346,57 +343,22 @@ public final class AtomixLeaderElectorCommands { | ... | @@ -346,57 +343,22 @@ public final class AtomixLeaderElectorCommands { |
| 346 | } | 343 | } |
| 347 | 344 | ||
| 348 | /** | 345 | /** |
| 349 | - * Command for administratively promote a node as top candidate. | 346 | + * Command for administratively anoint a node as leader. |
| 350 | */ | 347 | */ |
| 351 | @SuppressWarnings("serial") | 348 | @SuppressWarnings("serial") |
| 352 | - public static class Promote extends ElectionCommand<Boolean> { | 349 | + public static class Anoint extends ElectionChangeCommand<Boolean> { |
| 353 | - private String topic; | 350 | + public Anoint(String topic, NodeId nodeId) { |
| 354 | - private NodeId nodeId; | 351 | + super(topic, nodeId); |
| 355 | - | ||
| 356 | - public Promote() { | ||
| 357 | - } | ||
| 358 | - | ||
| 359 | - public Promote(String topic, NodeId nodeId) { | ||
| 360 | - this.topic = topic; | ||
| 361 | - this.nodeId = nodeId; | ||
| 362 | } | 352 | } |
| 363 | - | ||
| 364 | - /** | ||
| 365 | - * Returns the topic. | ||
| 366 | - * | ||
| 367 | - * @return The topic | ||
| 368 | - */ | ||
| 369 | - public String topic() { | ||
| 370 | - return topic; | ||
| 371 | } | 353 | } |
| 372 | 354 | ||
| 373 | /** | 355 | /** |
| 374 | - * Returns the nodeId to make top candidate. | 356 | + * Command for administratively promote a node as top candidate. |
| 375 | - * | ||
| 376 | - * @return The nodeId | ||
| 377 | */ | 357 | */ |
| 378 | - public NodeId nodeId() { | 358 | + @SuppressWarnings("serial") |
| 379 | - return nodeId; | 359 | + public static class Promote extends ElectionChangeCommand<Boolean> { |
| 380 | - } | 360 | + public Promote(String topic, NodeId nodeId) { |
| 381 | - | 361 | + super(topic, nodeId); |
| 382 | - @Override | ||
| 383 | - public String toString() { | ||
| 384 | - return MoreObjects.toStringHelper(getClass()) | ||
| 385 | - .add("topic", topic) | ||
| 386 | - .add("nodeId", nodeId) | ||
| 387 | - .toString(); | ||
| 388 | - } | ||
| 389 | - | ||
| 390 | - @Override | ||
| 391 | - public void writeObject(BufferOutput<?> buffer, Serializer serializer) { | ||
| 392 | - buffer.writeString(topic); | ||
| 393 | - buffer.writeString(nodeId.toString()); | ||
| 394 | - } | ||
| 395 | - | ||
| 396 | - @Override | ||
| 397 | - public void readObject(BufferInput<?> buffer, Serializer serializer) { | ||
| 398 | - topic = buffer.readString(); | ||
| 399 | - nodeId = new NodeId(buffer.readString()); | ||
| 400 | } | 362 | } |
| 401 | } | 363 | } |
| 402 | 364 | ... | ... |
| ... | @@ -97,7 +97,7 @@ public class AtomixLeaderElectorState extends ResourceStateMachine | ... | @@ -97,7 +97,7 @@ public class AtomixLeaderElectorState extends ResourceStateMachine |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | private void notifyLeadershipChange(Leadership previousLeadership, Leadership newLeadership) { | 99 | private void notifyLeadershipChange(Leadership previousLeadership, Leadership newLeadership) { |
| 100 | - notifyLeadershipChanges(Arrays.asList(new Change<>(previousLeadership, newLeadership))); | 100 | + notifyLeadershipChanges(Lists.newArrayList(new Change<>(previousLeadership, newLeadership))); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | private void notifyLeadershipChanges(List<Change<Leadership>> changes) { | 103 | private void notifyLeadershipChanges(List<Change<Leadership>> changes) { |
| ... | @@ -247,7 +247,7 @@ public class AtomixLeaderElectorState extends ResourceStateMachine | ... | @@ -247,7 +247,7 @@ public class AtomixLeaderElectorState extends ResourceStateMachine |
| 247 | */ | 247 | */ |
| 248 | public void evict(Commit<? extends Evict> commit) { | 248 | public void evict(Commit<? extends Evict> commit) { |
| 249 | try { | 249 | try { |
| 250 | - List<Change<Leadership>> changes = Lists.newLinkedList(); | 250 | + List<Change<Leadership>> changes = Lists.newArrayList(); |
| 251 | NodeId nodeId = commit.operation().nodeId(); | 251 | NodeId nodeId = commit.operation().nodeId(); |
| 252 | Set<String> topics = Maps.filterValues(elections, e -> e.candidates().contains(nodeId)).keySet(); | 252 | Set<String> topics = Maps.filterValues(elections, e -> e.candidates().contains(nodeId)).keySet(); |
| 253 | topics.forEach(topic -> { | 253 | topics.forEach(topic -> { |
| ... | @@ -330,14 +330,16 @@ public class AtomixLeaderElectorState extends ResourceStateMachine | ... | @@ -330,14 +330,16 @@ public class AtomixLeaderElectorState extends ResourceStateMachine |
| 330 | listener.close(); | 330 | listener.close(); |
| 331 | } | 331 | } |
| 332 | Set<String> topics = elections.keySet(); | 332 | Set<String> topics = elections.keySet(); |
| 333 | + List<Change<Leadership>> changes = Lists.newArrayList(); | ||
| 333 | topics.forEach(topic -> { | 334 | topics.forEach(topic -> { |
| 334 | Leadership oldLeadership = leadership(topic); | 335 | Leadership oldLeadership = leadership(topic); |
| 335 | elections.compute(topic, (k, v) -> v.cleanup(session, termCounter(topic)::incrementAndGet)); | 336 | elections.compute(topic, (k, v) -> v.cleanup(session, termCounter(topic)::incrementAndGet)); |
| 336 | Leadership newLeadership = leadership(topic); | 337 | Leadership newLeadership = leadership(topic); |
| 337 | if (!Objects.equal(oldLeadership, newLeadership)) { | 338 | if (!Objects.equal(oldLeadership, newLeadership)) { |
| 338 | - notifyLeadershipChange(oldLeadership, newLeadership); | 339 | + changes.add(new Change<>(oldLeadership, newLeadership)); |
| 339 | } | 340 | } |
| 340 | }); | 341 | }); |
| 342 | + notifyLeadershipChanges(changes); | ||
| 341 | } | 343 | } |
| 342 | 344 | ||
| 343 | private static class Registration { | 345 | private static class Registration { | ... | ... |
-
Please register or login to post a comment