Add a non-voting learner peer. Learners receive replicated log entries but do not vote and do not count toward the commit quorum. If this node is currently the leader, the learner is immediately added to `LeaderState` replication tracking so the next heartbeat ships entries to it. No-op if `peer` is self, already a voter, or already a learner.
(&mut self, peer: u64)
| 94 | /// |
| 95 | /// No-op if `peer` is self, already a voter, or already a learner. |
| 96 | pub fn add_learner(&mut self, peer: u64) { |
| 97 | if peer == self.config.node_id |
| 98 | || self.config.peers.contains(&peer) |
| 99 | || self.config.learners.contains(&peer) |
| 100 | { |
| 101 | return; |
| 102 | } |
| 103 | |
| 104 | let last_index = self.log.last_index(); |
| 105 | if let Some(ref mut leader) = self.leader_state { |
| 106 | leader.add_peer(peer, last_index); |
| 107 | } |
| 108 | self.config.learners.push(peer); |
| 109 | |
| 110 | info!( |
| 111 | node = self.config.node_id, |
| 112 | group = self.config.group_id, |
| 113 | peer, |
| 114 | "added learner peer" |
| 115 | ); |
| 116 | } |
| 117 | |
| 118 | /// Remove a learner peer (e.g., join was rolled back before promotion). |
| 119 | pub fn remove_learner(&mut self, peer: u64) { |