Exemple #1
0
        public override void OnHandshakeDone(AsyncSocket so)
        {
            base.OnHandshakeDone(so);

            // 没有判断是否和其他Raft-Node的连接。
            if (Raft.IsLeader && Raft.LeaderReadyEvent.WaitOne(0))
            {
                var r = new LeaderIs();
                r.Argument.Term     = Raft.LogSequence.Term;
                r.Argument.LeaderId = Raft.LeaderId;
                r.Send(so); // skip result
            }
        }
Exemple #2
0
 private void TrySendLeaderIs(AsyncSocket sender)
 {
     if (Raft.HasLeader)
     {
         // redirect
         var redirect = new LeaderIs();
         redirect.Argument.Term     = Raft.LogSequence.Term;
         redirect.Argument.LeaderId = Raft.LeaderId;
         redirect.Send(sender); // ignore response
         // DONOT process application request.
         return;
     }
 }
Exemple #3
0
 internal bool TrySetLeader(LeaderIs r, ConnectorEx newLeader)
 {
     lock (this)
     {
         if (r.Argument.Term < newLeader.Term)
         {
             logger.Warn("{0} Skip LeaderIs {1}", Name, r);
             return(false);
         }
         if (_Leader != newLeader)
         {
             // 把旧的_Leader的没有返回结果的请求收集起来,准备重新发送。
             CollectPendingRpc(_Leader, _Leader?.Socket);
         }
         newLeader.Term = r.Argument.Term;
         _Leader        = newLeader;
         return(true);
     }
 }
Exemple #4
0
        internal void SetLeaderReady()
        {
            if (IsLeader)
            {
                LeaderReadyEvent.Set();
                Monitor.PulseAll(this);

                Server.Foreach(
                    (allsocket) =>
                {
                    // 本来这个通告发给Agent(client)即可,
                    // 但是现在没有区分是来自Raft的连接还是来自Agent,
                    // 全部发送。
                    // 另外Raft之间有两个连接,会收到多次,Raft不处理这个通告。
                    // 由于Raft数量不多,不会造成大的浪费,不做处理了。
                    var r               = new LeaderIs();
                    r.Argument.Term     = LogSequence.Term;
                    r.Argument.LeaderId = LeaderId;
                    r.Send(allsocket);     // skip response.
                });
            }
        }