@@ -266,6 +266,7 @@ impl<C: RaftTypeConfig, N: RaftNetworkFactory<C>, S: RaftStorage<C>> RaftCore<C,
266
266
const IS_VOTER : bool = true ;
267
267
const IS_LEARNER : bool = false ;
268
268
269
+ // TODO: these part can be removed. the loop does not depend on server state
269
270
self . engine . state . server_state = match ( has_log, single, is_voter) {
270
271
// A restarted raft that already received some logs but was not yet added to a cluster.
271
272
// It should remain in Learner state, not Follower.
@@ -288,12 +289,8 @@ impl<C: RaftTypeConfig, N: RaftNetworkFactory<C>, S: RaftStorage<C>> RaftCore<C,
288
289
( NO_LOG , MULTI , IS_VOTER ) => ServerState :: Follower , // impossible: no logs but there are other members.
289
290
} ;
290
291
291
- if self . engine . state . server_state == ServerState :: Follower
292
- || self . engine . state . server_state == ServerState :: Candidate
293
- {
294
- // To ensure that restarted nodes don't disrupt a stable cluster.
295
- self . set_next_election_time ( false ) ;
296
- }
292
+ // To ensure that restarted nodes don't disrupt a stable cluster.
293
+ self . set_next_election_time ( false ) ;
297
294
298
295
tracing:: debug!( "id={} target_state: {:?}" , self . id, self . engine. state. server_state) ;
299
296
@@ -1380,9 +1377,15 @@ impl<C: RaftTypeConfig, N: RaftNetworkFactory<C>, S: RaftStorage<C>> RaftCore<C,
1380
1377
}
1381
1378
}
1382
1379
1383
- RaftMsg :: RevertToFollower { target, new_vote, vote } => {
1384
- if self . does_vote_match ( vote, "RevertToFollower" ) {
1385
- self . handle_revert_to_follower ( target, new_vote) . await ?;
1380
+ RaftMsg :: HigherVote {
1381
+ target : _,
1382
+ higher,
1383
+ vote,
1384
+ } => {
1385
+ if self . does_vote_match ( vote, "HigherVote" ) {
1386
+ // Rejected vote change is ok.
1387
+ let _ = self . engine . handle_vote_change ( & higher) ;
1388
+ self . run_engine_commands :: < Entry < C > > ( & [ ] ) . await ?;
1386
1389
}
1387
1390
}
1388
1391
@@ -1418,22 +1421,6 @@ impl<C: RaftTypeConfig, N: RaftNetworkFactory<C>, S: RaftStorage<C>> RaftCore<C,
1418
1421
Ok ( ( ) )
1419
1422
}
1420
1423
1421
- /// Handle events from replication streams for when this node needs to revert to follower state.
1422
- #[ tracing:: instrument( level = "trace" , skip( self ) ) ]
1423
- async fn handle_revert_to_follower (
1424
- & mut self ,
1425
- _target : C :: NodeId ,
1426
- vote : Vote < C :: NodeId > ,
1427
- ) -> Result < ( ) , StorageError < C :: NodeId > > {
1428
- if vote > self . engine . state . vote {
1429
- self . engine . state . vote = vote;
1430
- self . save_vote ( ) . await ?;
1431
- // TODO: when switching to Follower, the next election time has to be set.
1432
- self . set_target_state ( ServerState :: Follower ) ;
1433
- }
1434
- Ok ( ( ) )
1435
- }
1436
-
1437
1424
#[ tracing:: instrument( level = "debug" , skip_all) ]
1438
1425
async fn handle_update_matched (
1439
1426
& mut self ,
@@ -1591,6 +1578,16 @@ impl<C: RaftTypeConfig, N: RaftNetworkFactory<C>, S: RaftStorage<C>> RaftRuntime
1591
1578
debug_assert ! ( self . leader_data. is_none( ) , "can not become leader twice" ) ;
1592
1579
self . leader_data = Some ( LeaderData :: new ( ) ) ;
1593
1580
} else {
1581
+ if let Some ( l) = & mut self . leader_data {
1582
+ // Leadership lost, inform waiting clients
1583
+ let chans = std:: mem:: take ( & mut l. client_resp_channels ) ;
1584
+ for ( _, tx) in chans. into_iter ( ) {
1585
+ let _ = tx. send ( Err ( ClientWriteError :: ForwardToLeader ( ForwardToLeader {
1586
+ leader_id : None ,
1587
+ leader_node : None ,
1588
+ } ) ) ) ;
1589
+ }
1590
+ }
1594
1591
self . leader_data = None ;
1595
1592
}
1596
1593
}
0 commit comments