Handle incoming AppendEntries RPC.
(&mut self, req: &AppendEntriesRequest)
| 12 | impl<S: LogStorage> RaftNode<S> { |
| 13 | /// Handle incoming AppendEntries RPC. |
| 14 | pub fn handle_append_entries(&mut self, req: &AppendEntriesRequest) -> AppendEntriesResponse { |
| 15 | if req.term < self.hard_state.current_term { |
| 16 | return AppendEntriesResponse { |
| 17 | term: self.hard_state.current_term, |
| 18 | success: false, |
| 19 | last_log_index: self.log.last_index(), |
| 20 | }; |
| 21 | } |
| 22 | |
| 23 | if req.term > self.hard_state.current_term || self.role == NodeRole::Candidate { |
| 24 | // `become_follower` preserves Learner role — see internal.rs. |
| 25 | self.become_follower(req.term); |
| 26 | } |
| 27 | |
| 28 | self.leader_id = req.leader_id; |
| 29 | self.reset_election_timeout(); |
| 30 | |
| 31 | // Check prev_log consistency. |
| 32 | if req.prev_log_index > 0 { |
| 33 | match self.log.term_at(req.prev_log_index) { |
| 34 | Some(term) if term == req.prev_log_term => {} |
| 35 | _ => { |
| 36 | return AppendEntriesResponse { |
| 37 | term: self.hard_state.current_term, |
| 38 | success: false, |
| 39 | last_log_index: self.log.last_index(), |
| 40 | }; |
| 41 | } |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | if let Err(e) = self.log.append_entries(req.prev_log_index, &req.entries) { |
| 46 | warn!(group = self.config.group_id, error = %e, "append_entries failed"); |
| 47 | return AppendEntriesResponse { |
| 48 | term: self.hard_state.current_term, |
| 49 | success: false, |
| 50 | last_log_index: self.log.last_index(), |
| 51 | }; |
| 52 | } |
| 53 | |
| 54 | if req.leader_commit > self.volatile.commit_index { |
| 55 | self.volatile.commit_index = req.leader_commit.min(self.log.last_index()); |
| 56 | self.collect_committed_entries(); |
| 57 | } |
| 58 | |
| 59 | AppendEntriesResponse { |
| 60 | term: self.hard_state.current_term, |
| 61 | success: true, |
| 62 | last_log_index: self.log.last_index(), |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | /// Handle AppendEntries response from a peer (leader only). |
| 67 | /// |