private Task <HttpResponseMessage> SendLeaderRequestVote(string nodeAddress) { var url = nodeAddress.AppendPathSegment("api/raft/request-vote"); _logger.LogInformation($"Sending leader request to node: '{nodeAddress}'. Endpoint address: '{url}'."); var request = new HttpRequestMessage(HttpMethod.Post, url); request.Headers.Authorization = new AuthenticationHeaderValue( _consensusContext.ConsensusOptions.AuthenticationScheme, _consensusContext.ConsensusOptions.AuthenticationParameter); var requestVoteEvent = new RequestVoteEvent(_consensusContext.CurrentTerm, _consensusContext.CurrentNode); var jsonContent = JsonConvert.SerializeObject(requestVoteEvent); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); request.Content = content; var task = _consensusContext.HttpClient.SendAsync(request); return(task); }
private bool OtherNodeCanBeLeader(RequestVoteEvent requestVoteEvent) { return(requestVoteEvent.Term >= _consensusContext.CurrentTerm && requestVoteEvent.Term > _consensusContext.NodeVote.VoteTerm); }
public ActionResult RequestVote([FromBody] RequestVoteEvent requestVoteEvent) { var response = _consensusContext.State.TriggerEvent(requestVoteEvent); return(new ObjectResult(response)); }