@@ -25,14 +25,16 @@ async fn test_leader_election() {
2525 sleep ( Duration :: from_secs ( 2 ) ) ;
2626
2727 // THEN
28- let mut handler = ClientStreamHandler :: new ( follower_p1. bind_addr ( ) ) . await ;
29- let mut handler2 = ClientStreamHandler :: new ( follower_p2. bind_addr ( ) ) . await ;
30-
31- let response1 = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
32- let response2 = handler2. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
33-
34- // THEN - one of the replicas should become the leader
35- assert ! ( [ response1, response2] . iter( ) . any( |d| d. contains( "role:leader" ) ) ) ;
28+ let mut flag = false ;
29+ for f in [ & follower_p1, & follower_p2] {
30+ let mut handler = ClientStreamHandler :: new ( f. bind_addr ( ) ) . await ;
31+ let response1 = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
32+ if response1. contains ( "role:leader" ) {
33+ flag = true ;
34+ break ;
35+ }
36+ }
37+ assert ! ( flag, "No leader found after the first leader was killed" ) ;
3638}
3739
3840// ! EDGE case : when last_log_term is not updated, after the election, first write operation succeeds but second one doesn't
@@ -58,17 +60,20 @@ async fn test_set_twice_after_election() {
5860 // WHEN
5961 leader_p. kill ( ) . unwrap ( ) ;
6062 sleep ( Duration :: from_secs ( 1 ) ) ;
61- let mut handler = ClientStreamHandler :: new ( follower_p1. bind_addr ( ) ) . await ;
62- let mut handler2 = ClientStreamHandler :: new ( follower_p2. bind_addr ( ) ) . await ;
63- let response1 = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
64-
65- if response1. contains ( "role:leader" ) {
66- let _ = handler. send_and_get ( & array ( vec ! [ "set" , "1" , "2" ] ) ) . await ;
67- let _ = handler. send_and_get ( & array ( vec ! [ "set" , "2" , "3" ] ) ) . await ;
68- } else {
69- let _ = handler2. send_and_get ( & array ( vec ! [ "set" , "1" , "2" ] ) ) . await ;
70- let _ = handler2. send_and_get ( & array ( vec ! [ "set" , "2" , "3" ] ) ) . await ;
71- } ;
63+
64+ let mut flag = false ;
65+ for f in [ & follower_p1, & follower_p2] {
66+ let mut handler = ClientStreamHandler :: new ( f. bind_addr ( ) ) . await ;
67+ let res = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
68+ if res. contains ( "role:leader" ) {
69+ // THEN - one of the replicas should become the leader
70+ let _ = handler. send_and_get ( & array ( vec ! [ "set" , "1" , "2" ] ) ) . await ;
71+ let _ = handler. send_and_get ( & array ( vec ! [ "set" , "2" , "3" ] ) ) . await ;
72+ flag = true ;
73+ break ;
74+ }
75+ }
76+ assert ! ( flag, "No leader found after the first leader was killed" ) ;
7277}
7378
7479/// following test is to see if election works even after the first election.
@@ -89,41 +94,38 @@ async fn test_leader_election_twice() {
8994 let processes = & mut [ & mut leader_p, & mut follower_p1, & mut follower_p2] ;
9095 check_internodes_communication ( processes, DEFAULT_HOP_COUNT , TIMEOUT_IN_MILLIS ) . unwrap ( ) ;
9196
92- // WHEN
97+ // !first leader is killed -> election happens
9398 leader_p. kill ( ) . unwrap ( ) ;
9499 sleep ( Duration :: from_secs ( 1 ) ) ;
95- let mut handler = ClientStreamHandler :: new ( follower_p1. bind_addr ( ) ) . await ;
96- let mut handler2 = ClientStreamHandler :: new ( follower_p2. bind_addr ( ) ) . await ;
97- let response1 = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
98-
99- if response1. contains ( "role:leader" ) {
100- let follower_p3 = spawn_server_process (
101- & ServerEnv :: default ( ) . with_leader_bind_addr ( follower_p1. bind_addr ( ) . into ( ) ) ,
102- ) ;
103- sleep ( Duration :: from_secs ( 1 ) ) ;
104- follower_p1. kill ( ) . unwrap ( ) ;
105- sleep ( Duration :: from_secs ( 1 ) ) ;
106- let mut handler3 = ClientStreamHandler :: new ( follower_p3. bind_addr ( ) ) . await ;
107-
108- let response2 = handler2. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
109- let response3 = handler3. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
110- // THEN - one of the replicas should become the leader
111100
112- assert ! ( [ response2, response3] . iter( ) . any( |d| d. contains( "role:leader" ) ) ) ;
113- } else {
114- let follower_p3 = spawn_server_process (
115- & ServerEnv :: default ( ) . with_leader_bind_addr ( follower_p2. bind_addr ( ) . into ( ) ) ,
116- ) ;
117- sleep ( Duration :: from_secs ( 1 ) ) ;
118- follower_p2. kill ( ) . unwrap ( ) ;
101+ let mut processes = vec ! [ ] ;
102+
103+ for mut f in [ follower_p1, follower_p2] {
104+ let mut handler = ClientStreamHandler :: new ( f. bind_addr ( ) ) . await ;
105+ let res = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
106+ if !res. contains ( "role:leader" ) {
107+ processes. push ( f) ;
108+ continue ;
109+ }
110+ let new_process =
111+ spawn_server_process ( & ServerEnv :: default ( ) . with_leader_bind_addr ( f. bind_addr ( ) . into ( ) ) ) ;
119112 sleep ( Duration :: from_secs ( 1 ) ) ;
120113
121- let mut handler3 = ClientStreamHandler :: new ( follower_p3. bind_addr ( ) ) . await ;
122-
123- let response1 = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
124- let response3 = handler3. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
125-
126- // THEN - one of the replicas should become the leader
127- assert ! ( [ response1, response3] . iter( ) . any( |d| d. contains( "role:leader" ) ) ) ;
128- } ;
114+ // WHEN
115+ // ! second leader is killed -> election happens
116+ f. kill ( ) . unwrap ( ) ;
117+ processes. push ( new_process) ;
118+ }
119+ assert_eq ! ( processes. len( ) , 2 ) ;
120+
121+ let mut flag = false ;
122+ for f in processes. iter ( ) {
123+ let mut handler = ClientStreamHandler :: new ( f. bind_addr ( ) ) . await ;
124+ let res = handler. send_and_get ( & array ( vec ! [ "info" , "replication" ] ) ) . await ;
125+ if res. contains ( "role:leader" ) {
126+ flag = true ;
127+ break ;
128+ }
129+ }
130+ assert ! ( flag, "No leader found after the second leader was killed" ) ;
129131}
0 commit comments