Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 22 additions & 6 deletions src/raft/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,12 @@ fn raft_event_loop(

// Step incoming raft messages.
if !msgs.is_empty() {
tracing::info!(node_id = config.id, messages_count = msgs.len(), "stepping {} messages", msgs.len());
tracing::info!(
node_id = config.id,
messages_count = msgs.len(),
"stepping {} messages",
msgs.len()
);
}
for msg in msgs {
if let Err(e) = node.step(msg) {
Expand Down Expand Up @@ -419,15 +424,17 @@ fn raft_event_loop(

// Process all available ready states before blocking again.
while node.has_ready() {

let mut ready = node.ready();

// Step 1: Send outgoing messages from Leader BEFORE persisting.
// According to raft-rs best practices, Leader should send messages in parallel with persistence.
// Only Leader has messages in take_messages(); Follower messages come from take_persisted_messages().
let mut messages = ready.take_messages();
if !messages.is_empty() {
tracing::info!(messages_count = messages.len(), "sending leader messages before persistence");
tracing::info!(
messages_count = messages.len(),
"sending leader messages before persistence"
);
for msg in &messages {
tracing::debug!(from = msg.from, to = msg.to, msg_type = ?raft::eraftpb::MessageType::from_i32(msg.msg_type), "leader outgoing message");
}
Expand All @@ -453,7 +460,10 @@ fn raft_event_loop(

// Step 2: Persist entries to the log store.
if !ready.entries().is_empty() {
tracing::info!(entries_count = ready.entries().len(), "persisting entries from Ready");
tracing::info!(
entries_count = ready.entries().len(),
"persisting entries from Ready"
);
if let Err(e) = node.store().append_entries(ready.entries()) {
tracing::error!(error = %e, "failed to persist entries");
return;
Expand All @@ -471,7 +481,10 @@ fn raft_event_loop(
// Step 4: Send persisted messages (mainly for Follower nodes).
let persisted_msgs = ready.take_persisted_messages();
if !persisted_msgs.is_empty() {
tracing::info!(persisted_count = persisted_msgs.len(), "sending persisted messages");
tracing::info!(
persisted_count = persisted_msgs.len(),
"sending persisted messages"
);
for msg in &persisted_msgs {
tracing::debug!(from = msg.from, to = msg.to, msg_type = ?raft::eraftpb::MessageType::from_i32(msg.msg_type), "persisted outgoing message");
}
Expand Down Expand Up @@ -511,7 +524,10 @@ fn raft_event_loop(
// Step 6b: Send messages from LightReady (may contain responses after advance).
let light_msgs = light_ready.take_messages();
if !light_msgs.is_empty() {
tracing::info!(messages_count = light_msgs.len(), "sending messages from LightReady");
tracing::info!(
messages_count = light_msgs.len(),
"sending messages from LightReady"
);
let _ = msg_out_tx.blocking_send(light_msgs);
}

Expand Down
Loading