prevote_tests.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. }