@Override
public void initiate(RaftActor raftActor) {
AbstractLeader leader = (AbstractLeader) raftActor.getCurrentBehavior();
-
AddServer addServer = getAddServerContext().getOperation();
LOG.debug("{}: Initiating {}", raftContext.getId(), addServer);
+ if(raftContext.getPeerInfo(addServer.getNewServerId()) != null) {
+ operationComplete(raftActor, getAddServerContext(), ServerChangeStatus.ALREADY_EXISTS);
+ return;
+ }
+
VotingState votingState = addServer.isVotingMember() ? VotingState.VOTING_NOT_INITIALIZED :
VotingState.NON_VOTING;
raftContext.addToPeers(addServer.getNewServerId(), addServer.getNewServerAddress(), votingState);
votingServer(NEW_SERVER_ID));
}
+ @Test
+ public void testAddServerWithExistingServer() {
+ RaftActorContext initialActorContext = new MockRaftActorContext();
+
+ TestActorRef<MockLeaderRaftActor> leaderActor = actorFactory.createTestActor(
+ MockLeaderRaftActor.props(ImmutableMap.of(FOLLOWER_ID, followerActor.path().toString()),
+ initialActorContext).withDispatcher(Dispatchers.DefaultDispatcherId()),
+ actorFactory.generateActorId(LEADER_ID));
+
+ leaderActor.tell(new AddServer(FOLLOWER_ID, followerActor.path().toString(), true), testKit.getRef());
+
+ AddServerReply addServerReply = testKit.expectMsgClass(JavaTestKit.duration("5 seconds"), AddServerReply.class);
+ assertEquals("getStatus", ServerChangeStatus.ALREADY_EXISTS, addServerReply.getStatus());
+ }
+
@Test
public void testAddServerForwardedToLeader() {
DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
configParams.setElectionTimeoutFactor(100000);
ElectionTermImpl termInfo = new ElectionTermImpl(NO_PERSISTENCE, id, LOG);
termInfo.update(1, LEADER_ID);
- RaftActorContext followerActorContext = new RaftActorContextImpl(actor, actor.underlyingActor().getContext(),
- id, termInfo, -1, -1,
- ImmutableMap.of(LEADER_ID, ""), configParams, NO_PERSISTENCE, LOG);
- followerActorContext.setCommitIndex(-1);
- followerActorContext.setLastApplied(-1);
- followerActorContext.setReplicatedLog(new MockRaftActorContext.MockReplicatedLogBuilder().build());
-
- return followerActorContext;
+ return new RaftActorContextImpl(actor, actor.underlyingActor().getContext(),
+ id, termInfo, -1, -1, ImmutableMap.of(LEADER_ID, ""), configParams, NO_PERSISTENCE, LOG);
}
static abstract class AbstractMockRaftActor extends MockRaftActor {