Skip to content

Commit 98107fd

Browse files
do not send messages
Signed-off-by: Little-Wallace <[email protected]>
1 parent 2d721a6 commit 98107fd

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

src/raft.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ pub struct Raft<T: Storage> {
128128
/// The list of messages.
129129
pub msgs: Vec<Message>,
130130

131+
/// The list of heartbeat messages.
132+
pub heartbeats: Vec<Message>,
133+
131134
/// The leader id
132135
pub leader_id: u64,
133136

@@ -246,6 +249,7 @@ impl<T: Storage> Raft<T> {
246249
election_timeout: c.election_tick,
247250
votes: Default::default(),
248251
msgs: Default::default(),
252+
heartbeats: Default::default(),
249253
leader_id: Default::default(),
250254
lead_transferee: None,
251255
term: Default::default(),
@@ -710,10 +714,12 @@ impl<T: Storage> Raft<T> {
710714
m.set_msg_type(MessageType::MsgHeartbeat);
711715
let commit = cmp::min(pr.matched, self.raft_log.committed);
712716
m.commit = commit;
717+
m.from = self.id;
718+
m.term = self.term;
713719
if let Some(context) = ctx {
714720
m.context = context;
715721
}
716-
self.send(m);
722+
self.heartbeats.push(m);
717723
}
718724

719725
/// Sends RPC, with entries to all peers that are not up-to-date
@@ -2005,7 +2011,16 @@ impl<T: Storage> Raft<T> {
20052011
to_send.to = m.from;
20062012
to_send.context = m.take_context();
20072013
to_send.commit = self.raft_log.committed;
2008-
self.send(to_send);
2014+
if self.raft_log.committed > self.raft_log.store.last_index().unwrap()
2015+
{
2016+
// If there is some entries that has committed in memory but not persisted, the message
2017+
// shall not be sent until all entries before committed_index have been persisted.
2018+
self.send(to_send);
2019+
} else {
2020+
to_send.term = self.term;
2021+
to_send.from = self.id;
2022+
self.heartbeats.push(to_send);
2023+
}
20092024
}
20102025

20112026
fn handle_snapshot(&mut self, mut m: Message) {

0 commit comments

Comments
 (0)