public void TruncatingLogSetsCommitAndApplyIndexToIndexToTruncateFrom() { // Arrange var eventDispatcher = Substitute.For <IEventDispatcher>(); var raftNode = new Node(eventDispatcher) { Data = { CommitIndex = 10, LastApplied = 10 } }; var cmd = new TruncateLog { TruncateFromIndex = raftNode.Data.CommitIndex - 5 }; TransitionNodeFromInitialState(raftNode, NodeState.Follower); raftNode.FireAtStateMachine <TruncateLog>(); // Act raftNode.Handle(cmd); // Assert raftNode.Data.CommitIndex.Should().Be(cmd.TruncateFromIndex); raftNode.Data.LastApplied.Should().Be(cmd.TruncateFromIndex); }
public void Handle(TruncateLog @event) { if (@event.TruncateFromIndex > Data.CommitIndex) { throw new InvalidOperationException("Cannot truncate from the specified index as it is greater than the nodes current commit index."); } Data.CommitIndex = @event.TruncateFromIndex; Data.LastApplied = @event.TruncateFromIndex; Data.Log.TruncateLog(@event.TruncateFromIndex); }
public void TruncatingCallsTruncateLogOnNodeLog() { // Arrange const long logTerm = 34; const long initialIdx = 10; const long truncateFromIdx = initialIdx / 2; var eventDispatcher = Substitute.For <IEventDispatcher>(); var raftNode = new Node(eventDispatcher) { Data = { CommitIndex = initialIdx, CurrentTerm = logTerm } }; for (var i = 0; i < initialIdx; i++) { raftNode.Data.Log.SetLogEntry(i + 1, logTerm); } raftNode.Data.Log[truncateFromIdx].Should().Be(logTerm); raftNode.Data.Log[truncateFromIdx + 1].Should().Be(logTerm); var cmd = new TruncateLog { TruncateFromIndex = truncateFromIdx }; TransitionNodeFromInitialState(raftNode, NodeState.Follower); raftNode.FireAtStateMachine <TruncateLog>(); // Act raftNode.Handle(cmd); // Assert raftNode.Data.Log[truncateFromIdx].Should().Be(logTerm); raftNode.Data.Log[truncateFromIdx + 1].Should().NotHaveValue(); }