コード例 #1
0
        public AppendEntriesResponse Handle(AppendEntries appendEntries)
        {
            var response = _rules.AppendEntriesTermIsLessThanCurrentTerm(appendEntries, CurrentState);

            if (response.shouldReturn)
            {
                return(response.appendEntriesResponse);
            }

            response = _rules.LogDoesntContainEntryAtPreviousLogIndexWhoseTermMatchesPreviousLogTerm(appendEntries, _log, CurrentState);

            if (response.shouldReturn)
            {
                return(response.appendEntriesResponse);
            }

            _rules.DeleteAnyConflictsInLog(appendEntries, _log);

            _rules.ApplyEntriesToLog(appendEntries, _log);

            var commitIndexAndLastApplied = _rules.CommitIndexAndLastApplied(appendEntries, _log, CurrentState);

            ApplyToStateMachine(commitIndexAndLastApplied.commitIndex, commitIndexAndLastApplied.lastApplied);

            SetLeaderId(appendEntries);

            AppendEntriesTermIsGreaterThanCurrentTerm(appendEntries);

            return(new AppendEntriesResponse(CurrentState.CurrentTerm, true));
        }
コード例 #2
0
ファイル: Follower.cs プロジェクト: rfum/Rafty
        public async Task <AppendEntriesResponse> Handle(AppendEntries appendEntries)
        {
            var response = _rules.AppendEntriesTermIsLessThanCurrentTerm(appendEntries, CurrentState);

            if (response.shouldReturn)
            {
                return(response.appendEntriesResponse);
            }

            response = await _rules.LogDoesntContainEntryAtPreviousLogIndexWhoseTermMatchesPreviousLogTerm(appendEntries, _log, CurrentState);

            if (response.shouldReturn)
            {
                return(response.appendEntriesResponse);
            }

            await _rules.DeleteAnyConflictsInLog(appendEntries, _log);

            await _rules.ApplyEntriesToLog(appendEntries, _log);

            var commitIndexAndLastApplied = await _rules.CommitIndexAndLastApplied(appendEntries, _log, CurrentState);

            await ApplyToStateMachine(commitIndexAndLastApplied.commitIndex, commitIndexAndLastApplied.lastApplied, appendEntries);

            SetLeaderId(appendEntries);

            _messagesSinceLastElectionExpiry++;

            return(new AppendEntriesResponse(CurrentState.CurrentTerm, true));
        }
コード例 #3
0
        private void AppendEntriesTermIsGreaterThanCurrentTerm(AppendEntries appendEntries)
        {
            if (appendEntries.Term > CurrentState.CurrentTerm)
            {
                CurrentState = new CurrentState(CurrentState.Id, appendEntries.Term, CurrentState.VotedFor,
                                                CurrentState.CommitIndex, CurrentState.LastApplied, CurrentState.LeaderId);

                BecomeFollower();
            }
        }
コード例 #4
0
ファイル: Follower.cs プロジェクト: zhaoyingju/Rafty
        private void ApplyToStateMachine(int commitIndex, int lastApplied, AppendEntries appendEntries)
        {
            while (commitIndex > lastApplied)
            {
                lastApplied++;
                var log = _log.Get(lastApplied);
                _fsm.Handle(log);
            }

            CurrentState = new CurrentState(CurrentState.Id, appendEntries.Term,
                                            CurrentState.VotedFor, commitIndex, lastApplied, CurrentState.LeaderId);
        }
コード例 #5
0
        public async Task <AppendEntriesResponse> Handle(AppendEntries appendEntries)
        {
            if (appendEntries.Term > CurrentState.CurrentTerm)
            {
                var response = await _rules.CommitIndexAndLastApplied(appendEntries, _log, CurrentState);

                await ApplyToStateMachine(appendEntries, response.commitIndex, response.lastApplied);

                SetLeaderId(appendEntries);

                _node.BecomeFollower(CurrentState);

                return(new AppendEntriesResponse(CurrentState.CurrentTerm, true));
            }

            return(new AppendEntriesResponse(CurrentState.CurrentTerm, false));
        }
コード例 #6
0
 public AppendEntriesResponse Handle(AppendEntries appendEntries)
 {
     return(State.Handle(appendEntries));
 }
コード例 #7
0
 private void SetLeaderId(AppendEntries appendEntries)
 {
     CurrentState = new CurrentState(CurrentState.Id, CurrentState.CurrentTerm, CurrentState.VotedFor, CurrentState.CommitIndex, CurrentState.LastApplied, appendEntries.LeaderId);
 }
コード例 #8
0
 public async Task <AppendEntriesResponse> Handle(AppendEntries appendEntries)
 {
     return(await State.Handle(appendEntries));
 }
コード例 #9
0
ファイル: Peer.cs プロジェクト: zhaoyingju/Rafty
 public AppendEntriesResponse Request(AppendEntries appendEntries)
 {
     throw new NotImplementedException();
 }