@@ -34,7 +34,10 @@ use crate::Vote;
34
34
/// Config for Engine
35
35
#[ derive( Clone , Debug ) ]
36
36
#[ derive( PartialEq , Eq ) ]
37
- pub ( crate ) struct EngineConfig {
37
+ pub ( crate ) struct EngineConfig < NID : NodeId > {
38
+ /// The id of this node.
39
+ pub ( crate ) id : NID ,
40
+
38
41
/// The maximum number of applied logs to keep before purging.
39
42
pub ( crate ) max_in_snapshot_log_to_keep : u64 ,
40
43
@@ -45,9 +48,10 @@ pub(crate) struct EngineConfig {
45
48
pub ( crate ) max_payload_entries : u64 ,
46
49
}
47
50
48
- impl Default for EngineConfig {
51
+ impl < NID : NodeId > Default for EngineConfig < NID > {
49
52
fn default ( ) -> Self {
50
53
Self {
54
+ id : NID :: default ( ) ,
51
55
max_in_snapshot_log_to_keep : 1000 ,
52
56
purge_batch_size : 256 ,
53
57
max_payload_entries : 300 ,
71
75
N : Node ,
72
76
NID : NodeId ,
73
77
{
74
- /// TODO:
75
- #[ allow( dead_code) ]
76
- pub ( crate ) id : NID ,
77
-
78
- pub ( crate ) config : EngineConfig ,
78
+ pub ( crate ) config : EngineConfig < NID > ,
79
79
80
80
/// The state of this raft node.
81
81
pub ( crate ) state : RaftState < NID , N > ,
95
95
N : Node ,
96
96
NID : NodeId ,
97
97
{
98
- pub ( crate ) fn new ( id : NID , init_state : & RaftState < NID , N > , config : EngineConfig ) -> Self {
98
+ pub ( crate ) fn new ( init_state : & RaftState < NID , N > , config : EngineConfig < NID > ) -> Self {
99
99
Self {
100
- id,
101
100
config,
102
101
state : init_state. clone ( ) ,
103
102
internal_server_state : InternalServerState :: default ( ) ,
@@ -112,13 +111,17 @@ where
112
111
// On startup, do not assume a leader. Becoming a leader require initialization on several fields.
113
112
// TODO: allows starting up as a leader. After `server_state` is removed from Engine.
114
113
115
- let server_state = if self . state . membership_state . effective . is_voter ( & self . id ) {
114
+ let server_state = if self . state . membership_state . effective . is_voter ( & self . config . id ) {
116
115
ServerState :: Follower
117
116
} else {
118
117
ServerState :: Learner
119
118
} ;
120
119
121
- tracing:: debug!( "startup: id={} target_state: {:?}" , self . id, self . state. server_state) ;
120
+ tracing:: debug!(
121
+ "startup: id={} target_state: {:?}" ,
122
+ self . config. id,
123
+ self . state. server_state
124
+ ) ;
122
125
123
126
self . state . server_state = server_state;
124
127
}
@@ -164,11 +167,11 @@ where
164
167
/// Start to elect this node as leader
165
168
#[ tracing:: instrument( level = "debug" , skip( self ) ) ]
166
169
pub ( crate ) fn elect ( & mut self ) {
167
- self . handle_vote_change ( & Vote :: new ( self . state . vote . term + 1 , self . id ) ) . unwrap ( ) ;
170
+ self . handle_vote_change ( & Vote :: new ( self . state . vote . term + 1 , self . config . id ) ) . unwrap ( ) ;
168
171
169
172
// Safe unwrap()
170
173
let leader = self . internal_server_state . leading_mut ( ) . unwrap ( ) ;
171
- leader. grant_vote_by ( self . id ) ;
174
+ leader. grant_vote_by ( self . config . id ) ;
172
175
let quorum_granted = leader. is_vote_granted ( ) ;
173
176
174
177
// Fast-path: if there is only one node in the cluster.
@@ -262,7 +265,7 @@ where
262
265
263
266
debug_assert_eq ! (
264
267
Some ( NodeRole :: Voter ) ,
265
- self . state. membership_state. effective. get_node_role( & self . id)
268
+ self . state. membership_state. effective. get_node_role( & self . config . id)
266
269
) ;
267
270
268
271
// If peer's vote is greater than current vote, revert to follower state.
@@ -340,7 +343,7 @@ where
340
343
341
344
if log_index > 0 {
342
345
if let Some ( prev_log_id) = self . state . get_log_id ( log_index - 1 ) {
343
- self . update_progress ( self . id , Some ( prev_log_id) ) ;
346
+ self . update_progress ( self . config . id , Some ( prev_log_id) ) ;
344
347
}
345
348
}
346
349
@@ -349,7 +352,7 @@ where
349
352
}
350
353
}
351
354
if let Some ( last) = entries. last ( ) {
352
- self . update_progress ( self . id , Some ( * last. get_log_id ( ) ) ) ;
355
+ self . update_progress ( self . config . id , Some ( * last. get_log_id ( ) ) ) ;
353
356
}
354
357
355
358
// Still need to replicate to learners, even when it is fast-committed.
@@ -749,7 +752,7 @@ where
749
752
750
753
debug_assert ! ( log_id. is_some( ) , "a valid update can never set matching to None" ) ;
751
754
752
- if node_id != self . id {
755
+ if node_id != self . config . id {
753
756
self . push_command ( Command :: UpdateReplicationMetrics {
754
757
target : node_id,
755
758
matching : log_id. unwrap ( ) ,
@@ -779,7 +782,7 @@ where
779
782
/// This is only called by leader.
780
783
#[ tracing:: instrument( level = "debug" , skip_all) ]
781
784
pub ( crate ) fn leader_step_down ( & mut self ) {
782
- tracing:: debug!( "leader_step_down: node_id:{}" , self . id) ;
785
+ tracing:: debug!( "leader_step_down: node_id:{}" , self . config . id) ;
783
786
784
787
// Step down:
785
788
// Keep acting as leader until a membership without this node is committed.
@@ -794,8 +797,8 @@ where
794
797
795
798
#[ allow( clippy:: collapsible_if) ]
796
799
if em. log_id <= self . state . committed {
797
- if !em. is_voter ( & self . id ) && self . is_leading ( ) {
798
- tracing:: debug!( "leader {} is stepping down" , self . id) ;
800
+ if !em. is_voter ( & self . config . id ) && self . is_leading ( ) {
801
+ tracing:: debug!( "leader {} is stepping down" , self . config . id) ;
799
802
self . enter_following ( ) ;
800
803
}
801
804
}
@@ -935,7 +938,7 @@ where
935
938
/// `vote.node_id == self.id`: Leading state;
936
939
/// `vote.node_id != self.id`: Following state;
937
940
pub ( crate ) fn switch_internal_server_state ( & mut self ) {
938
- if self . state . vote . node_id == self . id {
941
+ if self . state . vote . node_id == self . config . id {
939
942
self . enter_leading ( ) ;
940
943
} else {
941
944
self . enter_following ( ) ;
@@ -946,7 +949,7 @@ where
946
949
///
947
950
/// Leader state has two phase: election phase and replication phase, similar to paxos phase-1 and phase-2
948
951
pub ( crate ) fn enter_leading ( & mut self ) {
949
- debug_assert_eq ! ( self . state. vote. node_id, self . id) ;
952
+ debug_assert_eq ! ( self . state. vote. node_id, self . config . id) ;
950
953
// debug_assert!(
951
954
// self.internal_server_state.is_following(),
952
955
// "can not enter leading twice"
@@ -1028,7 +1031,7 @@ where
1028
1031
} ;
1029
1032
self . state . log_ids . append ( log_id) ;
1030
1033
self . push_command ( Command :: AppendBlankLog { log_id } ) ;
1031
- self . update_progress ( self . id , Some ( log_id) ) ;
1034
+ self . update_progress ( self . config . id , Some ( log_id) ) ;
1032
1035
self . push_command ( Command :: ReplicateEntries { upto : Some ( log_id) } ) ;
1033
1036
}
1034
1037
@@ -1037,7 +1040,7 @@ where
1037
1040
if let Some ( leader) = self . internal_server_state . leading ( ) {
1038
1041
let mut targets = vec ! [ ] ;
1039
1042
for ( node_id, matched) in leader. progress . iter ( ) {
1040
- if node_id != & self . id {
1043
+ if node_id != & self . config . id {
1041
1044
targets. push ( ( * node_id, * matched) ) ;
1042
1045
}
1043
1046
}
@@ -1133,7 +1136,7 @@ where
1133
1136
let server_state = self . calc_server_state ( ) ;
1134
1137
1135
1138
tracing:: debug!(
1136
- id = display( self . id) ,
1139
+ id = display( self . config . id) ,
1137
1140
prev_server_state = debug( self . state. server_state) ,
1138
1141
server_state = debug( server_state) ,
1139
1142
"update_server_state_if_changed"
@@ -1176,9 +1179,9 @@ where
1176
1179
1177
1180
/// When initialize, the node that accept initialize request has to be a member of the initial config.
1178
1181
fn check_members_contain_me ( & self , m : & Membership < NID , N > ) -> Result < ( ) , NotInMembers < NID , N > > {
1179
- if !m. is_voter ( & self . id ) {
1182
+ if !m. is_voter ( & self . config . id ) {
1180
1183
let e = NotInMembers {
1181
- node_id : self . id ,
1184
+ node_id : self . config . id ,
1182
1185
membership : m. clone ( ) ,
1183
1186
} ;
1184
1187
Err ( e)
@@ -1270,16 +1273,16 @@ where
1270
1273
}
1271
1274
1272
1275
fn is_voter ( & self ) -> bool {
1273
- self . state . membership_state . is_voter ( & self . id )
1276
+ self . state . membership_state . is_voter ( & self . config . id )
1274
1277
}
1275
1278
1276
1279
/// The node is candidate or leader
1277
1280
fn is_leading ( & self ) -> bool {
1278
- self . state . vote . node_id == self . id
1281
+ self . state . vote . node_id == self . config . id
1279
1282
}
1280
1283
1281
1284
pub ( crate ) fn is_leader ( & self ) -> bool {
1282
- self . state . vote . node_id == self . id && self . state . vote . committed
1285
+ self . state . vote . node_id == self . config . id && self . state . vote . committed
1283
1286
}
1284
1287
1285
1288
fn push_command ( & mut self , cmd : Command < NID , N > ) {
0 commit comments