Skip to content

Commit 2f9fd16

Browse files
committed
Handle single-node Raft leaders during construction again
1 parent d1db7d7 commit 2f9fd16

File tree

3 files changed

+13
-13
lines changed

3 files changed

+13
-13
lines changed

Diff for: src/raft/node/follower.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl RoleNode<Follower> {
5959

6060
/// Transforms the node into a candidate, by campaigning for leadership in a
6161
/// new term.
62-
fn become_candidate(mut self) -> Result<RoleNode<Candidate>> {
62+
pub(super) fn become_candidate(mut self) -> Result<RoleNode<Candidate>> {
6363
// Abort any forwarded requests. These must be retried with new leader.
6464
self.abort_forwarded()?;
6565

@@ -232,11 +232,6 @@ impl RoleNode<Follower> {
232232
pub fn tick(mut self) -> Result<Node> {
233233
self.assert()?;
234234

235-
// If there are no peers, transition to leader immediately.
236-
if self.peers.is_empty() {
237-
return Ok(self.become_candidate()?.become_leader()?.into());
238-
}
239-
240235
self.role.leader_seen += 1;
241236
if self.role.leader_seen >= self.role.election_timeout {
242237
return Ok(self.become_candidate()?.into());

Diff for: src/raft/node/mod.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,20 @@ impl Node {
7070
tokio::spawn(driver.drive(state));
7171

7272
let (term, voted_for) = log.get_term()?;
73-
Ok(Node::Follower(RoleNode {
73+
let node = RoleNode {
7474
id,
7575
peers,
7676
term,
7777
log,
7878
node_tx,
7979
state_tx,
8080
role: Follower::new(None, voted_for),
81-
}))
81+
};
82+
if node.peers.is_empty() {
83+
// If there are no peers, become leader immediately.
84+
return Ok(node.become_candidate()?.become_leader()?.into());
85+
}
86+
Ok(node.into())
8287
}
8388

8489
/// Returns the node ID.
@@ -460,7 +465,7 @@ mod tests {
460465

461466
#[tokio::test]
462467
async fn new_single() -> Result<()> {
463-
let (node_tx, _) = mpsc::unbounded_channel();
468+
let (node_tx, _node_rx) = mpsc::unbounded_channel();
464469
let node = Node::new(
465470
1,
466471
HashSet::new(),

Diff for: tests/client/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ async fn status() -> Result<()> {
125125
server: 1,
126126
leader: 1,
127127
term: 1,
128-
node_last_index: vec![(1, 26)].into_iter().collect(),
129-
commit_index: 26,
130-
apply_index: 26,
128+
node_last_index: [(1, 27)].into(),
129+
commit_index: 27,
130+
apply_index: 27,
131131
storage: "bitcask".into(),
132-
storage_size: 1313,
132+
storage_size: 1324,
133133
},
134134
mvcc: mvcc::Status {
135135
versions: 1,

0 commit comments

Comments
 (0)