@@ -9,6 +9,7 @@ use crate::error::NotAllowed;
9
9
use crate :: error:: NotInMembers ;
10
10
use crate :: error:: RejectVoteRequest ;
11
11
use crate :: internal_server_state:: InternalServerState ;
12
+ use crate :: leader:: Leader ;
12
13
use crate :: membership:: EffectiveMembership ;
13
14
use crate :: membership:: NodeRole ;
14
15
use crate :: node:: Node ;
79
80
/// The state of this raft node.
80
81
pub ( crate ) state : RaftState < NID , N > ,
81
82
83
+ /// The internal server state used by Engine.
84
+ pub ( crate ) internal_server_state : InternalServerState < NID > ,
85
+
82
86
/// Tracks what kind of metrics changed
83
87
pub ( crate ) metrics_flags : MetricsChangeFlags ,
84
88
96
100
id,
97
101
config,
98
102
state : init_state. clone ( ) ,
103
+ internal_server_state : InternalServerState :: default ( ) ,
99
104
metrics_flags : MetricsChangeFlags :: default ( ) ,
100
105
commands : vec ! [ ] ,
101
106
}
@@ -162,7 +167,7 @@ where
162
167
self . handle_vote_change ( & Vote :: new ( self . state . vote . term + 1 , self . id ) ) . unwrap ( ) ;
163
168
164
169
// Safe unwrap()
165
- let leader = self . state . internal_server_state . leading_mut ( ) . unwrap ( ) ;
170
+ let leader = self . internal_server_state . leading_mut ( ) . unwrap ( ) ;
166
171
leader. grant_vote_by ( self . id ) ;
167
172
let quorum_granted = leader. is_vote_granted ( ) ;
168
173
@@ -233,7 +238,7 @@ where
233
238
) ;
234
239
235
240
// If this node is no longer a leader(i.e., electing), just ignore the delayed vote_resp.
236
- let leader = match & mut self . state . internal_server_state {
241
+ let leader = match & mut self . internal_server_state {
237
242
InternalServerState :: Leading ( l) => l,
238
243
InternalServerState :: Following => return ,
239
244
} ;
@@ -674,7 +679,7 @@ where
674
679
let end = self . state . last_log_id ( ) . next_index ( ) ;
675
680
676
681
// If membership changes, the progress should be upgraded.
677
- if let Some ( leader) = & mut self . state . internal_server_state . leading_mut ( ) {
682
+ if let Some ( leader) = & mut self . internal_server_state . leading_mut ( ) {
678
683
let old_progress = leader. progress . clone ( ) ;
679
684
let learner_ids = em. learner_ids ( ) . collect :: < Vec < _ > > ( ) ;
680
685
@@ -683,7 +688,7 @@ where
683
688
}
684
689
685
690
// A leader that is removed will be shut down when this membership log is committed.
686
- if self . state . internal_server_state . is_leading ( ) {
691
+ if self . internal_server_state . is_leading ( ) {
687
692
self . update_replications ( )
688
693
}
689
694
@@ -699,7 +704,7 @@ where
699
704
tracing:: debug!( "update_progress: node_id:{} log_id:{:?}" , node_id, log_id) ;
700
705
701
706
let committed = {
702
- let leader = match self . state . internal_server_state . leading_mut ( ) {
707
+ let leader = match self . internal_server_state . leading_mut ( ) {
703
708
None => {
704
709
// TODO: is it a bug if trying to update progress when it is not in leading state?
705
710
return ;
@@ -943,11 +948,11 @@ where
943
948
pub ( crate ) fn enter_leading ( & mut self ) {
944
949
debug_assert_eq ! ( self . state. vote. node_id, self . id) ;
945
950
// debug_assert!(
946
- // self.state. internal_server_state.is_following(),
951
+ // self.internal_server_state.is_following(),
947
952
// "can not enter leading twice"
948
953
// );
949
954
950
- self . state . new_leader ( ) ;
955
+ self . new_leader ( ) ;
951
956
}
952
957
953
958
/// Leave leading state and enter following state(vote.node_id != self.id).
@@ -962,7 +967,7 @@ where
962
967
// debug_assert_ne!(self.state.vote.node_id, self.id);
963
968
964
969
// debug_assert!(
965
- // self.state. internal_server_state.is_leading(),
970
+ // self.internal_server_state.is_leading(),
966
971
// "can not enter following twice"
967
972
// );
968
973
@@ -980,11 +985,11 @@ where
980
985
self . push_command ( Command :: InstallElectionTimer { can_be_leader : true } ) ;
981
986
}
982
987
983
- if self . state . internal_server_state . is_following ( ) {
988
+ if self . internal_server_state . is_following ( ) {
984
989
return ;
985
990
}
986
991
987
- self . state . internal_server_state = InternalServerState :: Following ;
992
+ self . internal_server_state = InternalServerState :: Following ;
988
993
989
994
self . update_server_state_if_changed ( ) ;
990
995
}
@@ -1005,6 +1010,17 @@ where
1005
1010
self . append_blank_log ( ) ;
1006
1011
}
1007
1012
1013
+ /// Create a new Leader, when raft enters candidate state.
1014
+ /// In openraft, Leader and Candidate shares the same state.
1015
+ pub ( crate ) fn new_leader ( & mut self ) {
1016
+ let em = & self . state . membership_state . effective ;
1017
+ self . internal_server_state = InternalServerState :: Leading ( Leader :: new (
1018
+ em. membership . to_quorum_set ( ) ,
1019
+ em. learner_ids ( ) ,
1020
+ self . state . last_log_id ( ) . index ( ) ,
1021
+ ) ) ;
1022
+ }
1023
+
1008
1024
fn append_blank_log ( & mut self ) {
1009
1025
let log_id = LogId {
1010
1026
leader_id : self . state . vote . leader_id ( ) ,
@@ -1018,7 +1034,7 @@ where
1018
1034
1019
1035
/// update replication streams to reflect replication progress change.
1020
1036
fn update_replications ( & mut self ) {
1021
- if let Some ( leader) = self . state . internal_server_state . leading ( ) {
1037
+ if let Some ( leader) = self . internal_server_state . leading ( ) {
1022
1038
let mut targets = vec ! [ ] ;
1023
1039
for ( node_id, matched) in leader. progress . iter ( ) {
1024
1040
if node_id != & self . id {
0 commit comments