Beispiel #1
0
        // processes ack for appenentries
        // keeps track of other nodes
        // update commit index
        internal override void ProcessAppendEntriesAck(AppendEntriesAck appendEntriesAck)
        {
            this.Logger.TraceFormat("Received AppendEntriesAck ({0}).", appendEntriesAck);

            if (appendEntriesAck.Term > this.CurrentTerm)
            {
                this.Logger.DebugFormat("Term is higher, I resign.");
                this.Node.SwitchTo(NodeStatus.Follower);
                return;
            }

            string followerId       = appendEntriesAck.NodeId;
            var    followerLogState = this.states[followerId];

            followerLogState.ProcessAppendEntriesAck(appendEntriesAck.Success);
            var message = followerLogState.GetAppendEntries(this.Node.State.LogEntries);

            if (appendEntriesAck.Success)
            {
                this.UpdateCommitIndex();
            }

            if (message == null)
            {
                return;
            }

            message.LeaderId    = this.Node.Id;
            message.LeaderTerm  = this.CurrentTerm;
            message.CommitIndex = this.Node.LastCommit;
            this.Node.SendMessage(followerId, message);
        }
Beispiel #2
0
 internal override void ProcessAppendEntries(AppendEntries <T> appendEntries)
 {
     if (appendEntries.LeaderTerm >= this.CurrentTerm)
     {
         this.Logger.InfoFormat(
             "Received AppendEntries from a probable leader, stepping down ({0}).",
             appendEntries);
         this.Node.SwitchToAndProcessMessage(NodeStatus.Follower, appendEntries);
     }
     else
     {
         Logger.Debug("Received AppendEntries from an invalid leader, refusing.");
         var reply = new AppendEntriesAck(this.Node.Id, this.CurrentTerm, false);
         this.Node.SendMessage(appendEntries.LeaderId, reply);
     }
 }
Beispiel #3
0
        internal override void ProcessAppendEntries(AppendEntries <T> appendEntries)
        {
            bool result;

            if (appendEntries.LeaderTerm < this.CurrentTerm)
            {
                // leader is older than us or log does not match
                this.Logger.DebugFormat(
                    "Reject an AppendEntries from an invalid leader ({0}).", appendEntries);
                result = false;
            }
            else
            {
                // we will proceed
                this.Node.LeaderId = appendEntries.LeaderId;
                if (appendEntries.LeaderTerm > this.CurrentTerm)
                {
                    this.Logger.TraceFormat("Upgrade our term to {0}.", this.CurrentTerm);
                    this.Node.State.CurrentTerm = appendEntries.LeaderTerm;
                }

                if (this.Node.State.EntryMatches(
                        appendEntries.PrevLogIndex, appendEntries.PrevLogTerm))
                {
                    this.Logger.TraceFormat(
                        "Process an AppendEntries request: {0}", appendEntries);
                    this.Node.State.AppendEntries(appendEntries.PrevLogIndex, appendEntries.Entries);
                    this.Node.Commit(appendEntries.CommitIndex);
                    result = true;
                }
                else
                {
                    // log does not match, we are not in sync with leader yet
                    this.Logger.DebugFormat(
                        "Reject an AppendEntries that does not match our log ({0}).",
                        appendEntries);
                    result = false;
                }
            }

            var reply = new AppendEntriesAck(this.Node.Id, this.CurrentTerm, result);

            this.Node.SendMessage(appendEntries.LeaderId, reply);
            this.ResetTimeout(.2);
        }
Beispiel #4
0
 internal virtual void ProcessAppendEntriesAck(AppendEntriesAck appendEntriesAck)
 {
     this.Logger.WarnFormat(
         "Received ProcessAppendEntriesAck but I am not a leader, discarded: {0}",
         appendEntriesAck);
 }