diff --git a/src/main.rs b/src/main.rs index 5304d3e87175ecbf9dc11cbb77d01df625cafa8a..906ab92bac4f10cba09421d114e6c67200585bab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -792,7 +792,7 @@ fn start_boot(args: &args::Run) { let mut hs = raft::HardState::default(); hs.set_commit(init_entries.len() as _); - hs.set_term(1); + hs.set_term(traft::INIT_RAFT_TERM); storage.raft.persist_hard_state(&hs).unwrap(); Ok(()) }) diff --git a/src/traft/mod.rs b/src/traft/mod.rs index 2edf448c3bbd2f9eb05c93dfbaf07d050aee359e..9a69aa0be47666e4037c10c620e722c0bcc37785 100644 --- a/src/traft/mod.rs +++ b/src/traft/mod.rs @@ -41,6 +41,8 @@ pub type RaftTerm = u64; pub type RaftIndex = u64; pub type ReplicasetId = String; +pub const INIT_RAFT_TERM: RaftTerm = 1; + //////////////////////////////////////////////////////////////////////////////// /// Unique id of a cluster instance. /// diff --git a/src/traft/node.rs b/src/traft/node.rs index b8408531bb381daa8471cd1087a6cde7a5f2077f..8ef2854653cad2f3100dec3bde08fe83eb598704 100644 --- a/src/traft/node.rs +++ b/src/traft/node.rs @@ -104,6 +104,8 @@ pub struct Status { pub id: RaftId, /// `raft_id` of the leader instance pub leader_id: Option<RaftId>, + /// Current term number + pub term: RaftTerm, /// Current raft state pub raft_state: RaftState, } @@ -143,6 +145,7 @@ impl Node { let status = Rc::new(Cell::new(Status { id: raft_id, leader_id: None, + term: traft::INIT_RAFT_TERM, raft_state: RaftState::Follower, })); @@ -748,6 +751,10 @@ impl NodeImpl { // Raft HardState changed, and we need to persist it. if let Some(hs) = ready.hs() { self.storage.raft.persist_hard_state(hs).unwrap(); + + let mut s = status.get(); + s.term = hs.term; + status.set(s); } Ok(()) @@ -1006,7 +1013,7 @@ fn raft_conf_change_loop(status: Rc<Cell<Status>>, storage: Storage) { let leader_id = status.get().id; let peers = storage.peers.all_peers().unwrap(); - let term = storage.raft.term().unwrap().unwrap_or(0); + let term = status.get().term; let cluster_id = storage.raft.cluster_id().unwrap().unwrap(); let node = global().expect("must be initialized"); diff --git a/test/conftest.py b/test/conftest.py index ac2320391ceaaaacd705d7c6f30d782d091cd4e7..b526c0f4bd7a40e9211f8749d576182426891467 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -159,6 +159,7 @@ def normalize_net_box_result(func): class RaftStatus: id: int raft_state: str + term: int leader_id: int | None = None