// 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); }
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); } }
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); }
internal virtual void ProcessAppendEntriesAck(AppendEntriesAck appendEntriesAck) { this.Logger.WarnFormat( "Received ProcessAppendEntriesAck but I am not a leader, discarded: {0}", appendEntriesAck); }