Search in sources :

Example 36 with Outcome

use of org.neo4j.causalclustering.core.consensus.outcome.Outcome in project neo4j by neo4j.

the class AppendingTest method shouldPerformTruncation.

@Test
public void shouldPerformTruncation() throws Exception {
    // when
    // we have a log appended up to appendIndex, and committed somewhere before that
    long appendIndex = 5;
    long localTermForAllEntries = 1L;
    Outcome outcome = mock(Outcome.class);
    ReadableRaftLog logMock = mock(ReadableRaftLog.class);
    // for simplicity, all entries are at term 1
    when(logMock.readEntryTerm(anyLong())).thenReturn(localTermForAllEntries);
    when(logMock.appendIndex()).thenReturn(appendIndex);
    ReadableRaftState state = mock(ReadableRaftState.class);
    when(state.entryLog()).thenReturn(logMock);
    when(state.commitIndex()).thenReturn(appendIndex - 3);
    // when
    // the leader asks to append after the commit index an entry that mismatches on term
    Appending.handleAppendEntriesRequest(state, outcome, new RaftMessages.AppendEntries.Request(aMember, localTermForAllEntries, appendIndex - 2, localTermForAllEntries, new RaftLogEntry[] { new RaftLogEntry(localTermForAllEntries + 1, ReplicatedInteger.valueOf(2)) }, appendIndex + 3), NullLog.getInstance());
    // then
    // we must produce a TruncateLogCommand at the earliest mismatching index
    verify(outcome, times(1)).addLogCommand(argThat(new LogCommandMatcher(appendIndex - 1)));
}
Also used : ReadableRaftLog(org.neo4j.causalclustering.core.consensus.log.ReadableRaftLog) Outcome(org.neo4j.causalclustering.core.consensus.outcome.Outcome) ReadableRaftState(org.neo4j.causalclustering.core.consensus.state.ReadableRaftState) RaftLogEntry(org.neo4j.causalclustering.core.consensus.log.RaftLogEntry) Test(org.junit.Test)

Example 37 with Outcome

use of org.neo4j.causalclustering.core.consensus.outcome.Outcome in project neo4j by neo4j.

the class AppendingTest method shouldNotAllowTruncationBeforeCommit.

@Test
public void shouldNotAllowTruncationBeforeCommit() throws Exception {
    // given
    long commitIndex = 5;
    long localTermForAllEntries = 1L;
    Outcome outcome = mock(Outcome.class);
    ReadableRaftLog logMock = mock(ReadableRaftLog.class);
    // for simplicity, all entries are at term 1
    when(logMock.readEntryTerm(anyLong())).thenReturn(localTermForAllEntries);
    when(logMock.appendIndex()).thenReturn(commitIndex);
    ReadableRaftState state = mock(ReadableRaftState.class);
    when(state.entryLog()).thenReturn(logMock);
    when(state.commitIndex()).thenReturn(commitIndex);
    // when - then
    try {
        Appending.handleAppendEntriesRequest(state, outcome, new RaftMessages.AppendEntries.Request(aMember, localTermForAllEntries, commitIndex - 2, localTermForAllEntries, new RaftLogEntry[] { new RaftLogEntry(localTermForAllEntries + 1, ReplicatedInteger.valueOf(2)) }, commitIndex + 3), NullLog.getInstance());
        fail("Appending should not allow truncation at or before the commit index");
    } catch (IllegalStateException expected) {
    // fine
    }
}
Also used : ReadableRaftLog(org.neo4j.causalclustering.core.consensus.log.ReadableRaftLog) Outcome(org.neo4j.causalclustering.core.consensus.outcome.Outcome) ReadableRaftState(org.neo4j.causalclustering.core.consensus.state.ReadableRaftState) RaftLogEntry(org.neo4j.causalclustering.core.consensus.log.RaftLogEntry) Test(org.junit.Test)

Example 38 with Outcome

use of org.neo4j.causalclustering.core.consensus.outcome.Outcome in project neo4j by neo4j.

the class AppendingTest method shouldNotAttemptToTruncateAtIndexBeforeTheLogPrevIndex.

@Test
public void shouldNotAttemptToTruncateAtIndexBeforeTheLogPrevIndex() throws Exception {
    // given
    // a log with prevIndex and prevTerm set
    ReadableRaftLog logMock = mock(ReadableRaftLog.class);
    long prevIndex = 5;
    long prevTerm = 5;
    when(logMock.prevIndex()).thenReturn(prevIndex);
    when(logMock.readEntryTerm(prevIndex)).thenReturn(prevTerm);
    // and which also properly returns -1 as the term for an unknown entry, in this case prevIndex - 2
    when(logMock.readEntryTerm(prevIndex - 2)).thenReturn(-1L);
    // also, a state with a given commitIndex, obviously ahead of prevIndex
    long commitIndex = 10;
    ReadableRaftState state = mock(ReadableRaftState.class);
    when(state.entryLog()).thenReturn(logMock);
    when(state.commitIndex()).thenReturn(commitIndex);
    // which is also the append index
    when(logMock.appendIndex()).thenReturn(commitIndex);
    // when
    // an appendEntriesRequest arrives for appending entries before the prevIndex (for whatever reason)
    Outcome outcome = mock(Outcome.class);
    Appending.handleAppendEntriesRequest(state, outcome, new RaftMessages.AppendEntries.Request(aMember, prevTerm, prevIndex - 2, prevTerm, new RaftLogEntry[] { new RaftLogEntry(prevTerm, ReplicatedInteger.valueOf(2)) }, commitIndex + 3), NullLog.getInstance());
    // then
    // there should be no truncate commands. Actually, the whole thing should be a no op
    verify(outcome, times(0)).addLogCommand(any());
}
Also used : ReadableRaftLog(org.neo4j.causalclustering.core.consensus.log.ReadableRaftLog) Outcome(org.neo4j.causalclustering.core.consensus.outcome.Outcome) ReadableRaftState(org.neo4j.causalclustering.core.consensus.state.ReadableRaftState) RaftLogEntry(org.neo4j.causalclustering.core.consensus.log.RaftLogEntry) Test(org.junit.Test)

Example 39 with Outcome

use of org.neo4j.causalclustering.core.consensus.outcome.Outcome in project neo4j by neo4j.

the class VoteRequestTest method shouldVoteForCandidateInLaterTerm.

@Test
public void shouldVoteForCandidateInLaterTerm() throws Exception {
    // given
    RaftState state = newState();
    // when
    final long candidateTerm = state.term() + 1;
    Outcome outcome = role.handler.handle(voteRequest().from(member1).term(candidateTerm).lastLogIndex(0).lastLogTerm(-1).build(), state, log());
    // then
    assertTrue(((RaftMessages.Vote.Response) messageFor(outcome, member1)).voteGranted());
}
Also used : Outcome(org.neo4j.causalclustering.core.consensus.outcome.Outcome) RaftState(org.neo4j.causalclustering.core.consensus.state.RaftState) Test(org.junit.Test)

Example 40 with Outcome

use of org.neo4j.causalclustering.core.consensus.outcome.Outcome in project neo4j by neo4j.

the class VoteRequestTest method shouldDenyForCandidateInPreviousTerm.

@Test
public void shouldDenyForCandidateInPreviousTerm() throws Exception {
    // given
    RaftState state = newState();
    // when
    final long candidateTerm = state.term() - 1;
    Outcome outcome = role.handler.handle(voteRequest().from(member1).term(candidateTerm).lastLogIndex(0).lastLogTerm(-1).build(), state, log());
    // then
    assertFalse(((RaftMessages.Vote.Response) messageFor(outcome, member1)).voteGranted());
    assertEquals(role, outcome.getRole());
}
Also used : Outcome(org.neo4j.causalclustering.core.consensus.outcome.Outcome) RaftState(org.neo4j.causalclustering.core.consensus.state.RaftState) Test(org.junit.Test)

Aggregations

Outcome (org.neo4j.causalclustering.core.consensus.outcome.Outcome)58 Test (org.junit.Test)53 RaftState (org.neo4j.causalclustering.core.consensus.state.RaftState)42 RaftLogEntry (org.neo4j.causalclustering.core.consensus.log.RaftLogEntry)27 InMemoryRaftLog (org.neo4j.causalclustering.core.consensus.log.InMemoryRaftLog)24 ReadableRaftState (org.neo4j.causalclustering.core.consensus.state.ReadableRaftState)19 RaftMessages (org.neo4j.causalclustering.core.consensus.RaftMessages)15 AppendEntries (org.neo4j.causalclustering.core.consensus.RaftMessages.AppendEntries)11 RaftLog (org.neo4j.causalclustering.core.consensus.log.RaftLog)11 ReadableRaftLog (org.neo4j.causalclustering.core.consensus.log.ReadableRaftLog)9 FollowerState (org.neo4j.causalclustering.core.consensus.roles.follower.FollowerState)6 FollowerStates (org.neo4j.causalclustering.core.consensus.roles.follower.FollowerStates)6 Log (org.neo4j.logging.Log)6 BatchAppendLogEntries (org.neo4j.causalclustering.core.consensus.outcome.BatchAppendLogEntries)5 ShipCommand (org.neo4j.causalclustering.core.consensus.outcome.ShipCommand)5 MemberId (org.neo4j.causalclustering.identity.MemberId)5 RaftTestGroup (org.neo4j.causalclustering.core.consensus.membership.RaftTestGroup)4 AppendLogEntry (org.neo4j.causalclustering.core.consensus.outcome.AppendLogEntry)4 ReplicatedString (org.neo4j.causalclustering.core.consensus.ReplicatedString)3 TruncateLogCommand (org.neo4j.causalclustering.core.consensus.outcome.TruncateLogCommand)3