void raftNode_OnRaftEvent(object sender, RaftEventResult e)
 {
     if (e.TimerSet)
     {
         Dispatcher.BeginInvoke(new Action(() => StartTimerAnimation(e.TimerValue)));
     }
 }
Beispiel #2
0
        public override RaftEventResult ReceiveAppendEntries(AppendEntriesRPC <T> appendEntries)
        {
            //Reply false if term from append entires < currentTerm (§5.1)
            if (appendEntries.LeaderTerm < CurrentTerm)
            {
                var falseResponse = new AppendEntriesResponse(CurrentTerm, Node.Id, false);
                return(RaftEventResult.ReplyMessage(falseResponse).SetTimer(Node.RaftSettings.FollowerTimeoutFrom, Node.RaftSettings.FollowerTimeoutTo));
            }

            CurrentTerm = appendEntries.LeaderTerm;

            //if (appendEntries.LogEntries != null)
            //    for (int i = 0; i < appendEntries.LogEntries.Count; i++)
            //    {
            //        if (appendEntries.LogEntries[i].CommitIndex > Node.Log.Count)
            //        {
            //            Node.Log.Add(appendEntries.LogEntries[i]);
            //            Node.CurrentIndex = appendEntries.LogEntries[i].CommitIndex;
            //        }
            //    }

            var aeResponse = new AppendEntriesResponse(CurrentTerm, Node.Id, true);

            return(RaftEventResult.ReplyMessage(aeResponse).SetTimer(Node.RaftSettings.FollowerTimeoutFrom, Node.RaftSettings.FollowerTimeoutTo));
        }
Beispiel #3
0
 void ProcessRaftResult(RaftEventResult raftResult, INetworkSocket channel = null)
 {
     if (raftResult == null)
     {
         throw new ArgumentNullException("raftResult");
     }
     if (raftResult.TimerSet)
     {
         RaftTimer.SetRandomTimeout(raftResult.TimerValue, raftResult.TimerValue);
     }
     if (raftResult.MessageToSend != null)
     {
         if (raftResult.DoBroadcast)
         {
             BroadcastMessage(raftResult.MessageToSend);
         }
         else
         {
             if (channel == null)
             {
                 throw new InvalidOperationException("Operation started with no channel");
             }
             SendMessage(channel, raftResult.MessageToSend);
         }
     }
     if (OnRaftEvent != null)
     {
         OnRaftEvent(this, raftResult);
     }
 }
Beispiel #4
0
 public override RaftEventResult ReceiveRequestVote(RequestVote requestVote)
 {
     if (requestVote.CandidateTerm > CurrentTerm)
     {
         return(Node.TranslateToState(RaftNodeState.Follower, requestVote));
     }
     return(RaftEventResult.ReplyMessage(DenyVote));
 }
Beispiel #5
0
 void host_OnRaftEvent(object sender, RaftEventResult e)
 {
     Application.Current.Dispatcher.BeginInvoke(new Action(() =>
     {
         UpdateViewModel();
         UpdateLogViewModel();
     }));
 }
Beispiel #6
0
        RaftEventResult BroadcastAppendEntries()
        {
            Node.RaftEventListener.OnAppendEntries();

            var appendEntriesMessage = new AppendEntriesRPC <T>(Node.PersistedState.CurrentTerm, Node.Id);

            appendEntriesMessage.LeaderCommit = Node.CurrentIndex;
            //for (int i=Node.CurrentIndex; i < Node.Log.Count; i++)
            //{
            //    if (appendEntriesMessage.LogEntries == null)
            //        appendEntriesMessage.LogEntries = new List<LogEntry<T>>();
            //    appendEntriesMessage.LogEntries.Add(Node.Log[i]);
            //}
            return(RaftEventResult.BroadcastMessage(appendEntriesMessage).SetTimer(Node.RaftSettings.LeaderTimeoutFrom, Node.RaftSettings.LeaderTimeoutTo));
        }
Beispiel #7
0
        public override RaftEventResult ReceiveRequestVote(RequestVote requestVote)
        {
            if (requestVote.CandidateId == Node.Id)
            {
                return(RaftEventResult.Empty);
            }


            bool voteGranted = false;

            if (requestVote.CandidateTerm >= CurrentTerm)
            {
                //  Node.CurrentTerm = requestVote.CandidateTerm;
                return(Node.TranslateToState(RaftNodeState.Follower, requestVote));
            }
            return(RaftEventResult.ReplyMessage(DenyVote));
        }
Beispiel #8
0
        RaftEventResult StartNewElection()
        {
            VoteTable.Clear();
            Node.RaftEventListener.OnElectionStarted();
            // increment current term
            Node.PersistedState.CurrentTerm++;
            // vote for self
            ProcessVote(Node.Id);
            Node.PersistedState.VotedFor = Node.Id;
            // send request votes to all servers
            var requestVote = new RequestVote()
            {
                CandidateId = Node.Id, CandidateTerm = CurrentTerm
            };

            return(RaftEventResult.BroadcastMessage(requestVote).SetTimer(Node.RaftSettings.FollowerTimeoutFrom, Node.RaftSettings.FollowerTimeoutTo));
        }
Beispiel #9
0
        public override RaftEventResult ReceiveRequestVote(RequestVote requestVote)
        {
            // we have more recent term so we dont vote
            if (requestVote.CandidateTerm < CurrentTerm)
            {
                return(RaftEventResult.ReplyMessage(DenyVote));
            }

            if (requestVote.CandidateTerm > CurrentTerm)
            {
                CurrentTerm = requestVote.CandidateTerm;
            }
            // if haven't voted before
            if (Node.PersistedState.VotedFor == null || Node.PersistedState.VotedFor == requestVote.CandidateId)
            {
                Node.PersistedState.VotedFor = requestVote.CandidateId;
                return(RaftEventResult.ReplyMessage(GrantVote).SetTimer(Node.RaftSettings.FollowerTimeoutFrom * 2, Node.RaftSettings.FollowerTimeoutTo * 2));
            }
            return(RaftEventResult.Empty);
        }