Example #1
0
        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);
        }
Example #2
0
 private bool OtherNodeCanBeLeader(RequestVoteEvent requestVoteEvent)
 {
     return(requestVoteEvent.Term >= _consensusContext.CurrentTerm &&
            requestVoteEvent.Term > _consensusContext.NodeVote.VoteTerm);
 }
Example #3
0
        public ActionResult RequestVote([FromBody] RequestVoteEvent requestVoteEvent)
        {
            var response = _consensusContext.State.TriggerEvent(requestVoteEvent);

            return(new ObjectResult(response));
        }