示例#1
0
        public override IResponse TriggerEvent(IEvent triggeredEvent)
        {
            var appendEntriesEvent = triggeredEvent as AppendEntriesEvent;

            if (appendEntriesEvent != null)
            {
                bool leaderNodeWasChanged = false;

                lock (_ensureLogLock)
                {
                    if (_consensusContext.NodeVote.LeaderNode == null ||
                        _consensusContext.NodeVote.LeaderNode.Id != appendEntriesEvent.LeaderNode.Id)
                    {
                        leaderNodeWasChanged = true;
                    }

                    _consensusContext.NodeVote.LeaderNode = appendEntriesEvent.LeaderNode;
                }

                _consensusContext.CurrentTerm       = appendEntriesEvent.Term;
                _consensusContext.NodeVote.VoteTerm = 0;
                _lastRertievedHeartbeat             = 0;

                if (leaderNodeWasChanged)
                {
                    _consensusContext.EnsureLogConsistency();
                }

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

            var requestVoteEvent = triggeredEvent as RequestVoteEvent;

            if (requestVoteEvent != null)
            {
                _logger.LogInformation($"Retreived 'LeaderRequestEvent' event (currentTerm: {requestVoteEvent.Term}, node: {requestVoteEvent.Node.Id}).");

                bool voteValue = OtherNodeCanBeLeader(requestVoteEvent);
                if (voteValue)
                {
                    _consensusContext.CurrentTerm         = requestVoteEvent.Term;
                    _consensusContext.NodeVote.LeaderNode = requestVoteEvent.Node;
                    _consensusContext.NodeVote.VoteTerm   = requestVoteEvent.Term;

                    _lastRertievedHeartbeat = 0;

                    _logger.LogInformation($"Voting for node ({requestVoteEvent.Node.Id}): GRANTED.");
                }
                else
                {
                    _logger.LogInformation($"Voting for node ({requestVoteEvent.Node.Id}): NOT GRANTED.");
                }

                return(new RequestVoteResponse(voteValue, _consensusContext.CurrentTerm, _consensusContext.CurrentNode));
            }

            return(new EmptyResponse());
        }