use of org.neo4j.causalclustering.core.consensus.membership.MembershipEntry in project neo4j by neo4j.
the class RaftMachineTest method shouldBecomeLeaderInMajorityOf5.
@Test
public void shouldBecomeLeaderInMajorityOf5() throws Exception {
// Given
FakeClock fakeClock = Clocks.fakeClock();
ControlledRenewableTimeoutService timeouts = new ControlledRenewableTimeoutService(fakeClock);
RaftMachine raft = new RaftMachineBuilder(myself, 3, RaftTestMemberSetBuilder.INSTANCE).timeoutService(timeouts).clock(fakeClock).build();
raft.installCoreState(new RaftCoreState(new MembershipEntry(0, asSet(myself, member1, member2, member3, member4))));
raft.startTimers();
timeouts.invokeTimeout(ELECTION);
raft.handle(voteResponse().from(member1).term(1).grant().build());
assertThat(raft.isLeader(), is(false));
// When
raft.handle(voteResponse().from(member2).term(1).grant().build());
// Then
assertThat(raft.isLeader(), is(true));
}
use of org.neo4j.causalclustering.core.consensus.membership.MembershipEntry in project neo4j by neo4j.
the class RaftMachineTest method leaderShouldSendHeartBeatsOnHeartbeatTimeout.
@Test
public void leaderShouldSendHeartBeatsOnHeartbeatTimeout() throws Exception {
// Given
FakeClock fakeClock = Clocks.fakeClock();
ControlledRenewableTimeoutService timeouts = new ControlledRenewableTimeoutService(fakeClock);
OutboundMessageCollector messages = new OutboundMessageCollector();
RaftMachine raft = new RaftMachineBuilder(myself, 3, RaftTestMemberSetBuilder.INSTANCE).timeoutService(timeouts).outbound(messages).clock(fakeClock).build();
raft.installCoreState(new RaftCoreState(new MembershipEntry(0, asSet(myself, member1, member2))));
raft.startTimers();
timeouts.invokeTimeout(ELECTION);
raft.handle(voteResponse().from(member1).term(1).grant().build());
// When
timeouts.invokeTimeout(RaftMachine.Timeouts.HEARTBEAT);
// Then
assertTrue(last(messages.sentTo(member1)) instanceof RaftMessages.Heartbeat);
assertTrue(last(messages.sentTo(member2)) instanceof RaftMessages.Heartbeat);
}
use of org.neo4j.causalclustering.core.consensus.membership.MembershipEntry in project neo4j by neo4j.
the class RaftMachineTest method shouldRequestVotesOnElectionTimeout.
@Test
public void shouldRequestVotesOnElectionTimeout() throws Exception {
// Given
FakeClock fakeClock = Clocks.fakeClock();
ControlledRenewableTimeoutService timeouts = new ControlledRenewableTimeoutService(fakeClock);
OutboundMessageCollector messages = new OutboundMessageCollector();
RaftMachine raft = new RaftMachineBuilder(myself, 3, RaftTestMemberSetBuilder.INSTANCE).timeoutService(timeouts).clock(fakeClock).outbound(messages).build();
raft.installCoreState(new RaftCoreState(new MembershipEntry(0, asSet(myself, member1, member2))));
raft.startTimers();
// When
timeouts.invokeTimeout(ELECTION);
// Then
assertThat(messages.sentTo(myself).size(), equalTo(0));
assertThat(messages.sentTo(member1).size(), equalTo(1));
assertThat(messages.sentTo(member1).get(0), instanceOf(RaftMessages.Vote.Request.class));
assertThat(messages.sentTo(member2).size(), equalTo(1));
assertThat(messages.sentTo(member2).get(0), instanceOf(RaftMessages.Vote.Request.class));
}
use of org.neo4j.causalclustering.core.consensus.membership.MembershipEntry in project neo4j by neo4j.
the class RaftMachineTest method shouldBecomeLeaderInMajorityOf3.
@Test
public void shouldBecomeLeaderInMajorityOf3() throws Exception {
// Given
FakeClock fakeClock = Clocks.fakeClock();
ControlledRenewableTimeoutService timeouts = new ControlledRenewableTimeoutService(fakeClock);
RaftMachine raft = new RaftMachineBuilder(myself, 3, RaftTestMemberSetBuilder.INSTANCE).timeoutService(timeouts).clock(fakeClock).build();
raft.installCoreState(new RaftCoreState(new MembershipEntry(0, asSet(myself, member1, member2))));
raft.startTimers();
timeouts.invokeTimeout(ELECTION);
assertThat(raft.isLeader(), is(false));
// When
raft.handle(voteResponse().from(member1).term(1).grant().build());
// Then
assertThat(raft.isLeader(), is(true));
}
use of org.neo4j.causalclustering.core.consensus.membership.MembershipEntry in project neo4j by neo4j.
the class RaftMachineTest method newMembersShouldBeIncludedInHeartbeatMessages.
@Test
public void newMembersShouldBeIncludedInHeartbeatMessages() throws Exception {
// Given
DirectNetworking network = new DirectNetworking();
final MemberId newMember = member(99);
DirectNetworking.Inbound newMemberInbound = network.new Inbound(newMember);
final OutboundMessageCollector messages = new OutboundMessageCollector();
newMemberInbound.registerHandler(new Inbound.MessageHandler<RaftMessages.RaftMessage>() {
@Override
public void handle(RaftMessages.RaftMessage message) {
messages.send(newMember, message);
}
});
FakeClock fakeClock = Clocks.fakeClock();
ControlledRenewableTimeoutService timeouts = new ControlledRenewableTimeoutService(fakeClock);
RaftMachine raft = new RaftMachineBuilder(myself, 3, RaftTestMemberSetBuilder.INSTANCE).timeoutService(timeouts).outbound(messages).clock(fakeClock).build();
raft.installCoreState(new RaftCoreState(new MembershipEntry(0, asSet(myself, member1, member2))));
raft.startTimers();
// We make ourselves the leader
timeouts.invokeTimeout(ELECTION);
raft.handle(voteResponse().from(member1).term(1).grant().build());
// When
raft.setTargetMembershipSet(asSet(myself, member1, member2, newMember));
network.processMessages();
timeouts.invokeTimeout(RaftMachine.Timeouts.HEARTBEAT);
network.processMessages();
// Then
assertEquals(RaftMessages.AppendEntries.Request.class, messages.sentTo(newMember).get(0).getClass());
}
Aggregations