Skip to content

Commit 2b2e34b

Browse files
committed
Improve a few Raft assertions
1 parent a0849a9 commit 2b2e34b

File tree

3 files changed

+15
-21
lines changed

3 files changed

+15
-21
lines changed

src/raft/node/candidate.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::super::{Address, Event, Message};
22
use super::{rand_election_timeout, Follower, Leader, Node, NodeID, RawNode, Role, Term, Ticks};
33
use crate::error::{Error, Result};
44

5-
use ::log::{debug, info, warn};
5+
use ::log::{debug, info};
66
use std::collections::HashSet;
77

88
/// A candidate is campaigning to become a leader.
@@ -134,7 +134,7 @@ impl RawNode<Candidate> {
134134
Event::ConfirmLeader { .. }
135135
| Event::AcceptEntries { .. }
136136
| Event::RejectEntries { .. }
137-
| Event::ClientResponse { .. } => warn!("Received unexpected message {:?}", msg),
137+
| Event::ClientResponse { .. } => panic!("Received unexpected message {:?}", msg),
138138
}
139139
Ok(self.into())
140140
}

src/raft/node/follower.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::super::{Address, Event, Instruction, Log, Message, RequestID, Respons
22
use super::{rand_election_timeout, Candidate, Node, NodeID, RawNode, Role, Term, Ticks};
33
use crate::error::{Error, Result};
44

5-
use ::log::{debug, error, info, warn};
5+
use ::log::{debug, info};
66
use std::collections::HashSet;
77
use tokio::sync::mpsc;
88

@@ -205,13 +205,14 @@ impl RawNode<Follower> {
205205
}
206206
}
207207

208+
// We may receive a vote after we lost an election and followed a
209+
// different leader. Ignore it.
210+
Event::GrantVote => {}
211+
208212
// Forward client requests to the leader, or abort them if there is
209213
// none (the client must retry).
210214
Event::ClientRequest { ref id, .. } => {
211-
if msg.from != Address::Client {
212-
error!("Received client request from non-client {:?}", msg.from);
213-
return Ok(self.into());
214-
}
215+
assert_eq!(msg.from, Address::Client, "Client request from non-client");
215216

216217
let id = id.clone();
217218
if let Some(leader) = self.role.leader {
@@ -225,10 +226,7 @@ impl RawNode<Follower> {
225226

226227
// Returns client responses for forwarded requests.
227228
Event::ClientResponse { id, mut response } => {
228-
if !self.is_leader(&msg.from) {
229-
error!("Received client response from non-leader {:?}", msg.from);
230-
return Ok(self.into());
231-
}
229+
assert!(self.is_leader(&msg.from), "Client response from non-leader");
232230

233231
// TODO: Get rid of this field, it should be returned at the RPC
234232
// server level instead.
@@ -243,8 +241,7 @@ impl RawNode<Follower> {
243241
// We're not a leader nor candidate in this term, so we shoudn't see these.
244242
Event::ConfirmLeader { .. }
245243
| Event::AcceptEntries { .. }
246-
| Event::RejectEntries { .. }
247-
| Event::GrantVote { .. } => warn!("Received unexpected message {:?}", msg),
244+
| Event::RejectEntries { .. } => panic!("Received unexpected message {:?}", msg),
248245
};
249246
Ok(self.into())
250247
}

src/raft/node/leader.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::super::{Address, Event, Index, Instruction, Message, Request, Response, Status};
1+
use super::super::{Address, Event, Index, Instruction, Message, Request, Status};
22
use super::{Follower, Node, NodeID, RawNode, Role, Term, Ticks, HEARTBEAT_INTERVAL};
33
use crate::error::Result;
44

@@ -177,15 +177,12 @@ impl RawNode<Leader> {
177177
self.state_tx.send(Instruction::Status { id, address: msg.from, status })?
178178
}
179179

180-
Event::ClientResponse { id, mut response } => {
181-
if let Ok(Response::Status(ref mut status)) = response {
182-
status.server = self.id;
183-
}
184-
self.send(Address::Client, Event::ClientResponse { id, response })?;
185-
}
186-
187180
// Votes can come in after we won the election, ignore them.
188181
Event::SolicitVote { .. } | Event::GrantVote => {}
182+
183+
// Leaders never proxy client requests, so we don't expect to see
184+
// responses from other nodes.
185+
Event::ClientResponse { .. } => panic!("Unexpected message {:?}", msg),
189186
}
190187

191188
Ok(self.into())

0 commit comments

Comments
 (0)