コード例 #1
0
        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);
                    }
                });
            }
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        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);
                }
            });
        }