@Test public void testOnGroupConfigEntryFromLeaderAppend() { NodeImpl node = (NodeImpl) newNodeBuilder( NodeId.of("A"), new NodeEndpoint("A", "localhost", 2333), new NodeEndpoint("B", "localhost", 2334), new NodeEndpoint("C", "localhost", 2335)) .build(); node.start(); GroupConfigEntry groupConfigEntry = new AddNodeEntry(1, 1, node.getContext().group().listEndpointOfMajor(), new NodeEndpoint("D", "localhost", 2336)); node.onGroupConfigEntryFromLeaderAppend(new GroupConfigEntryFromLeaderAppendEvent(groupConfigEntry)); Assert.assertEquals(4, node.getContext().group().getCountOfMajor()); }
@Subscribe public void onGroupConfigEntryFromLeaderAppend(GroupConfigEntryFromLeaderAppendEvent event) { context.taskExecutor().submit(() -> { GroupConfigEntry entry = event.getEntry(); if (entry.getKind() == Entry.KIND_REMOVE_NODE && context.selfId().equals(((RemoveNodeEntry) entry).getNodeToRemove())) { logger.info("current node is removed from group, step down and standby"); becomeFollower(role.getTerm(), null, null, false); } context.group().updateNodes(entry.getResultNodeEndpoints()); }, LOGGING_FUTURE_CALLBACK); }
NodeImpl implements Node { @Subscribe public void onGroupConfigEntryFromLeaderAppend(GroupConfigEntryFromLeaderAppendEvent event) { context.taskExecutor().submit(() -> { GroupConfigEntry entry = event.getEntry(); if (entry.getKind() == Entry.KIND_REMOVE_NODE && context.selfId().equals(((RemoveNodeEntry) entry).getNodeToRemove())) { logger.info("current node is removed from group, step down and standby"); becomeFollower(role.getTerm(), null, null, false); } context.group().updateNodes(entry.getResultNodeEndpoints()); }, LOGGING_FUTURE_CALLBACK); } }
NodeImpl implements Node { @Subscribe public void onGroupConfigEntryFromLeaderAppend(GroupConfigEntryFromLeaderAppendEvent event) { context.taskExecutor().submit(() -> { GroupConfigEntry entry = event.getEntry(); if (entry.getKind() == Entry.KIND_REMOVE_NODE && context.selfId().equals(((RemoveNodeEntry) entry).getNodeToRemove())) { logger.info("current node is removed from group, step down and standby"); becomeFollower(role.getTerm(), null, null, false); } context.group().updateNodes(entry.getResultNodeEndpoints()); }, LOGGING_FUTURE_CALLBACK); } NodeImpl(NodeContext context); }
NodeImpl implements Node { @Subscribe public void onGroupConfigEntryFromLeaderAppend(GroupConfigEntryFromLeaderAppendEvent event) { context.taskExecutor().submit(() -> { GroupConfigEntry entry = event.getEntry(); if (entry.getKind() == Entry.KIND_REMOVE_NODE && context.selfId().equals(((RemoveNodeEntry) entry).getNodeToRemove())) { logger.info("current node is removed from group, step down and standby"); becomeFollower(role.getTerm(), null, null, false); } context.group().updateNodes(entry.getResultNodeEndpoints()); }, LOGGING_FUTURE_CALLBACK); } NodeImpl(NodeContext context); @Override synchronized void registerStateMachine(@Nonnull StateMachine stateMachine); @Override @Nonnull RoleNameAndLeaderId getRoleNameAndLeaderId(); @Override void addNodeRoleListener(@Nonnull NodeRoleListener listener); @Override synchronized void start(); @Override void appendLog(@Nonnull byte[] commandBytes); @Override @Nonnull GroupConfigChangeTaskReference addNode(@Nonnull NodeEndpoint endpoint); @Override @Nonnull GroupConfigChangeTaskReference removeNode(@Nonnull NodeId id); @Subscribe void onReceiveRequestVoteRpc(RequestVoteRpcMessage rpcMessage); @Subscribe void onReceiveRequestVoteResult(RequestVoteResult result); @Subscribe void onReceiveAppendEntriesRpc(AppendEntriesRpcMessage rpcMessage); @Subscribe void onReceiveAppendEntriesResult(AppendEntriesResultMessage resultMessage); @Subscribe void onReceiveInstallSnapshotRpc(InstallSnapshotRpcMessage rpcMessage); @Subscribe void onReceiveInstallSnapshotResult(InstallSnapshotResultMessage resultMessage); @Subscribe void onGroupConfigEntryFromLeaderAppend(GroupConfigEntryFromLeaderAppendEvent event); @Subscribe void onGroupConfigEntryCommitted(GroupConfigEntryCommittedEvent event); @Subscribe void onGroupConfigEntryBatchRemoved(GroupConfigEntryBatchRemovedEvent event); @Subscribe void onGenerateSnapshot(SnapshotGenerateEvent event); @Subscribe void onReceiveDeadEvent(DeadEvent deadEvent); @Override synchronized void stop(); }
NodeImpl implements Node { @Subscribe public void onGroupConfigEntryFromLeaderAppend(GroupConfigEntryFromLeaderAppendEvent event) { context.taskExecutor().submit(() -> { GroupConfigEntry entry = event.getEntry(); if (entry.getKind() == Entry.KIND_REMOVE_NODE && context.selfId().equals(((RemoveNodeEntry) entry).getNodeToRemove())) { logger.info("current node is removed from group, step down and standby"); becomeFollower(role.getTerm(), null, null, false); } context.group().updateNodes(entry.getResultNodeEndpoints()); }, LOGGING_FUTURE_CALLBACK); } NodeImpl(NodeContext context); @Override synchronized void registerStateMachine(@Nonnull StateMachine stateMachine); @Override @Nonnull RoleNameAndLeaderId getRoleNameAndLeaderId(); @Override void addNodeRoleListener(@Nonnull NodeRoleListener listener); @Override synchronized void start(); @Override void appendLog(@Nonnull byte[] commandBytes); @Override @Nonnull GroupConfigChangeTaskReference addNode(@Nonnull NodeEndpoint endpoint); @Override @Nonnull GroupConfigChangeTaskReference removeNode(@Nonnull NodeId id); @Subscribe void onReceiveRequestVoteRpc(RequestVoteRpcMessage rpcMessage); @Subscribe void onReceiveRequestVoteResult(RequestVoteResult result); @Subscribe void onReceiveAppendEntriesRpc(AppendEntriesRpcMessage rpcMessage); @Subscribe void onReceiveAppendEntriesResult(AppendEntriesResultMessage resultMessage); @Subscribe void onReceiveInstallSnapshotRpc(InstallSnapshotRpcMessage rpcMessage); @Subscribe void onReceiveInstallSnapshotResult(InstallSnapshotResultMessage resultMessage); @Subscribe void onGroupConfigEntryFromLeaderAppend(GroupConfigEntryFromLeaderAppendEvent event); @Subscribe void onGroupConfigEntryCommitted(GroupConfigEntryCommittedEvent event); @Subscribe void onGroupConfigEntryBatchRemoved(GroupConfigEntryBatchRemovedEvent event); @Subscribe void onGenerateSnapshot(SnapshotGenerateEvent event); @Subscribe void onReceiveDeadEvent(DeadEvent deadEvent); @Override synchronized void stop();  }