コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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();
        }