@@ -36,6 +36,42 @@ async fn test_leader_election() {
3636 assert ! ( [ response1, response2] . iter( ) . any( |d| d. contains( "role:leader" ) ) ) ;
3737}
3838
39+ // ! EDGE case : when last_log_term is not updated, after the election, first write operation succeeds but second one doesn't
40+ // ! This is because the leader doesn't have the last_log_term of the first write operation
41+ // ! This test is to see if the leader can set the value twice after the election
42+ #[ tokio:: test]
43+ async fn test_set_twice_after_election ( ) {
44+ // GIVEN
45+ let mut leader_p = spawn_server_process ( & ServerEnv :: default ( ) ) ;
46+
47+ let mut follower_p1 = spawn_server_process (
48+ & ServerEnv :: default ( ) . with_leader_bind_addr ( leader_p. bind_addr ( ) . into ( ) ) ,
49+ ) ;
50+
51+ let mut follower_p2 = spawn_server_process (
52+ & ServerEnv :: default ( ) . with_leader_bind_addr ( leader_p. bind_addr ( ) . into ( ) ) ,
53+ ) ;
54+ const DEFAULT_HOP_COUNT : usize = 0 ;
55+ const TIMEOUT_IN_MILLIS : u128 = 2000 ;
56+ let processes = & mut [ & mut leader_p, & mut follower_p1, & mut follower_p2] ;
57+ check_internodes_communication ( processes, DEFAULT_HOP_COUNT , TIMEOUT_IN_MILLIS ) . unwrap ( ) ;
58+
59+ // WHEN
60+ leader_p. kill ( ) . unwrap ( ) ;
61+ sleep ( Duration :: from_secs ( 1 ) ) ;
62+ let mut handler = ClientStreamHandler :: new ( follower_p1. bind_addr ( ) ) . await ;
63+ let mut handler2 = ClientStreamHandler :: new ( follower_p2. bind_addr ( ) ) . await ;
64+ let response1 = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
65+
66+ if response1. contains ( "role:leader" ) {
67+ let _ = handler. send_and_get ( & array ( vec ! [ "set" , "1" , "2" ] ) ) . await ;
68+ let _ = handler. send_and_get ( & array ( vec ! [ "set" , "2" , "3" ] ) ) . await ;
69+ } else {
70+ let _ = handler2. send_and_get ( & array ( vec ! [ "set" , "1" , "2" ] ) ) . await ;
71+ let _ = handler2. send_and_get ( & array ( vec ! [ "set" , "2" , "3" ] ) ) . await ;
72+ } ;
73+ }
74+
3975/// following test is to see if election works even after the first election.
4076#[ tokio:: test]
4177async fn test_leader_election_twice ( ) {
0 commit comments