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 }); } }
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"); } }
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)); }