public void SendRequestVote(string clusterName, int peerId, long term, int candidateId, long lastLogIndex, long lastLogTerm, VoteResponseHandler handler) { if (rafts.TryGetValue(peerId, out var r)) { Task.Run(() => { // await Task.Delay(randomDelay()); try { r.HandleVoteRequest(clusterName, term, candidateId, lastLogIndex, lastLogTerm, handler); } catch (Exception) { // logger.error(t.getMessage(), t); } }); } }
public void HandleVoteRequest(String clusterName, long term, int candidateId, long lastLogIndex, long lastLogTerm, VoteResponseHandler handler) { lock (this) { if (config.ClusterName != clusterName || !IsValidPeer(candidateId)) { return; } if (term > currentTerm) { StepDown(term); } if (term >= currentTerm && (votedFor == 0 || votedFor == candidateId) && lastLogIndex >= Log.LastIndex && lastLogTerm >= Log.LastTerm) { votedFor = candidateId; RescheduleElection(); logger.LogInformation($"{this} I'm voting YES for {candidateId} (term {currentTerm})"); handler(currentTerm, true); } else { logger.LogInformation($"{this} I'm voting NO for {candidateId} (term {currentTerm})"); handler(currentTerm, false); } } }
void IRaftRPC.SendRequestVote(string clusterName, int peerId, long term, int candidateId, long lastLogIndex, long lastLogTerm, VoteResponseHandler handler) { var peer = Configuration.GetPeer(peerId); var msg = new RequestMessage(clusterName, peerId, term, candidateId, lastLogIndex, lastLogTerm); Task.Run(async() => { var response = await sender.SendMessage(peer, msg) as ResponseMessage; if (response != null) { handler(response.Term, response.VoteGranted); } }); }