prevote_tests.rs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. use scopeguard::defer;
  2. use test_configs::make_config;
  3. use test_configs::raft::config;
  4. use test_configs::utils::sleep_election_timeouts;
  5. #[test]
  6. fn no_disruptive_rejoin() -> config::Result<()> {
  7. const SERVERS: usize = 5;
  8. let cfg = make_config!(SERVERS, false);
  9. defer!(cfg.cleanup());
  10. let initial_leader = cfg.check_one_leader()?;
  11. cfg.one(100, SERVERS, false)?;
  12. let initial_term =
  13. cfg.check_terms()?.expect("Servers should agree on term");
  14. // 0 <--> 1 <--> 3
  15. // ^ ^
  16. // | |
  17. // | v
  18. // -----> 2 <--> 4
  19. let disruptor_1: usize = (initial_leader + 3) % SERVERS;
  20. let disruptor_2: usize = (initial_leader + 4) % SERVERS;
  21. cfg.disconnect(disruptor_1);
  22. cfg.disconnect(disruptor_2);
  23. // The disconnected servers (3 & 4) should not disrupt the exist leader.
  24. let disrupted_1: usize = (initial_leader + 1) % SERVERS;
  25. let disrupted_2: usize = (initial_leader + 2) % SERVERS;
  26. cfg.connect_pair(disrupted_1, disruptor_1);
  27. cfg.connect_pair(disrupted_2, disrupted_2);
  28. let leader = cfg.check_one_leader()?;
  29. cfg.one(200, 3, false)?;
  30. let (first_term, _) = cfg.leader_start(leader, 300).unwrap();
  31. assert_eq!(initial_leader, leader);
  32. assert_eq!(first_term, initial_term);
  33. sleep_election_timeouts(2);
  34. let (second_term, _) = cfg.leader_start(leader, 400).unwrap();
  35. assert_eq!(first_term, second_term);
  36. let index = cfg.one(500, 3, false)?;
  37. assert_eq!(index, 5);
  38. Ok(())
  39. }
  40. #[test]
  41. fn disruptive_liveness() -> config::Result<()> {
  42. const SERVERS: usize = 5;
  43. let cfg = make_config!(SERVERS, false);
  44. defer!(cfg.cleanup());
  45. let initial_leader = cfg.check_one_leader()?;
  46. cfg.one(100, SERVERS, false)?;
  47. cfg.check_terms()?.expect("Servers should agree on term");
  48. // 3 <--> 2 4
  49. // ^ ^
  50. // | |
  51. // | v
  52. // -----> 1 <--> 0
  53. // Disconnect 4
  54. let disruptor = (initial_leader + 4) % SERVERS;
  55. cfg.disconnect(disruptor);
  56. // Disconnect (0, 2) and (0, 3)
  57. cfg.disconnect_pair(initial_leader, (initial_leader + 2) % SERVERS);
  58. cfg.disconnect_pair(initial_leader, (initial_leader + 3) % SERVERS);
  59. sleep_election_timeouts(1);
  60. let leader = cfg.check_one_leader()?;
  61. cfg.one(200, 3, false)?;
  62. assert_ne!(initial_leader, leader);
  63. assert_ne!(disruptor, leader);
  64. Ok(())
  65. }