예제 #1
0
 public void CopyTo(Peer peer)
 {
     peer.RpcDue = this.RpcDue;
     peer.MatchIndex = this.MatchIndex;
     peer.NextIndex = this.NextIndex;
     peer.HeartBeartDue = this.HeartBeartDue;
 }
예제 #2
0
 public void SendReply(Peer peer, AppendEntriesReply reply)
 {
     SendMessage(peer, reply);
 }
예제 #3
0
        //public void SendRequest(Peer peer, StatusRequest request)
        //{
        //    SendMessage(peer, request);
        //}

        public void SendReply(Peer peer, VoteReply reply)
        {
            SendMessage(peer, reply);
        }
예제 #4
0
 public void SendRequest(Peer peer, AppendEntriesRequest request)
 {
     SendMessage(peer, request);
 }
예제 #5
0
 public void SendRequest(Peer peer, VoteRequest request)
 {
     SendMessage(peer, request);
 }
예제 #6
0
        private void SendMessage(Peer peer, object message)
        {
            if ((float)_random.NextDouble() < PACKET_LOSS)
            {
                //Console.WriteLine("** dropped packet to: {0}, type: {1}", peer.ID, message.GetType().Name);
                return;
            }

            var sm = new SimulationMessage()
            {
                To = peer.ID,
                From = 0,
                SendTick = _tick,
                RecvTick = _tick + _random.Next(ServerOld.MIN_RPC_LATENCY, ServerOld.MAX_RPC_LATENCY),
                Message = message
            };
            _messages.Add(sm);
            //Console.WriteLine("** MESSAGE:{0}, type: {1}, send: {2}, recv: {3}", peer.ID, message.GetType().Name, sm.SendTick, sm.RecvTick);
        }
예제 #7
0
        protected void sendRequestVote(IConsensus model, Peer peer)
        {
            if (_state == ServerState.Candidate && peer.CheckRpcTimeout(model))
            {
                //Console.WriteLine("{0}: Requesting vote from {1}", _id, peer.ID);

                LogIndex lastIndex;
                var lastLogIndex = _persistedState.GetLastIndex(out lastIndex);

                peer.RpcDue = model.Tick + RPC_TIMEOUT;
                model.SendRequest(peer, new VoteRequest()
                {
                    From = _id,
                    Term = _persistedState.Term,
                    LastTerm = lastIndex.Term,
                    LogLength = lastLogIndex
                });
            }
        }
예제 #8
0
        protected void sendAppendEntries(IConsensus model, Peer peer)
        {
            if (_state == ServerState.Leader &&
                (peer.HeartBeartDue <= model.Tick ||
                 (peer.NextIndex <= _persistedState.Length && peer.RpcDue <= model.Tick)))
            {
                var prevIndex = peer.NextIndex - 1;
                var lastIndex = Math.Min(prevIndex + BATCH_SIZE, _persistedState.Length);
                if (peer.MatchIndex + 1 < peer.NextIndex)
                    lastIndex = prevIndex;

                var entries = _persistedState.GetEntries(prevIndex, lastIndex);
                if (entries != null && entries.Length > 0)
                    Console.WriteLine("{0}: Send AppendEnties[{1}-{2}] to {3}", _id, prevIndex, lastIndex, peer.ID);

                peer.RpcDue = model.Tick + RPC_TIMEOUT;
                peer.HeartBeartDue = model.Tick + (ELECTION_TIMEOUT / 2);
                model.SendRequest(peer, new AppendEntriesRequest()
                {
                    From = _id,
                    Term = _persistedState.Term,
                    PrevIndex = prevIndex,
                    PrevTerm = _persistedState.GetTerm(prevIndex),
                    Entries = entries,
                    CommitIndex = Math.Min(_commitIndex, lastIndex)
                });
            }
        }
예제 #9
0
 protected void sendAddServer(IConsensus model, Peer peer)
 {
     if (_state == ServerState.Adding)
     {
         
     }
 }