Exemplo n.º 1
0
        public async Task <RequestVoteResult> RequestVoteAsync(RequestVoteArguments request)
        {
            lock (_lock)
            {
                if (request.Term > _currentTerm)
                {
                    Log.Information("Term {Term} is greater than my term {CurrentTerm}, resetting to follower. Candidate: {CandidateId}", request.Term, _currentTerm, request.CandidateId);
                    _currentTerm = request.Term;
                    _votedFor    = null;
                    State        = NodeState.Follower;
                }
                if (request.Term == _currentTerm)
                {
                    ResetElectionTimeout();
                    if (_votedFor == null)
                    {
                        Log.Information("Voted yes for {CandidateId} in term {Term}", request.CandidateId, request.Term);
                        _votedFor = request.CandidateId;
                        return(new RequestVoteResult
                        {
                            Term = _currentTerm,
                            VoteGranted = true
                        });
                    }
                }

                Log.Information("Voted no for {CandidateId} in term {Term}", request.CandidateId, request.Term);
                return(new RequestVoteResult
                {
                    Term = _currentTerm,
                    VoteGranted = false
                });
            }
        }
Exemplo n.º 2
0
        private async Task RequestVote(string node)
        {
            try
            {
                var request = new RequestVoteArguments
                {
                    CandidateId = NodeName,
                    Term        = _currentTerm
                };
                var result = await Communication.RequestVoteAsync(node, request);

                lock (_lock)
                {
                    if (result.Term > _currentTerm)
                    {
                        Log.Information("Term {Term} is greater than my term {CurrentTerm}, resetting to follower.", result.Term, _currentTerm);
                        _currentTerm = result.Term;
                        _votedFor    = null;
                        State        = NodeState.Follower;
                    }
                    else if (result.Term == _currentTerm && State == NodeState.Candidate)
                    {
                        Log.Information("Recieved vote {Vote} in term {Term}", result.VoteGranted, result.Term);
                        if (result.VoteGranted)
                        {
                            RecordVote();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error in RequestVote");
            }
        }
Exemplo n.º 3
0
 public async Task <RequestVoteResult> RequestVoteAsync(string destination, RequestVoteArguments message)
 {
     return((RequestVoteResult) await SendMessageAsync(destination, message));
 }
        public async Task <RequestVoteResult> RequestVoteAsync(string destination, RequestVoteArguments message)
        {
            var communication = _communication.GetCommunication(destination);

            return(await communication.Server.RequestVoteAsync(message));
        }