prevote_tests.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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. cfg.one(100, SERVERS, false)?;
  11. let initial_term =
  12. cfg.check_terms()?.expect("Servers should agree on term");
  13. // 0 <--> 1 <--> 3
  14. // ^ ^
  15. // | |
  16. // | v
  17. // -----> 2 <--> 4
  18. cfg.disconnect(4);
  19. cfg.disconnect(3);
  20. // The disconnected servers (3 & 4) should not disrupt the exist leader.
  21. cfg.connect_pair(2, 4);
  22. cfg.connect_pair(1, 3);
  23. let leader = cfg.check_one_leader()?;
  24. cfg.one(200, 3, false)?;
  25. let (first_term, _) = cfg.leader_start(leader, 300).unwrap();
  26. assert!(first_term >= initial_term);
  27. assert!(first_term <= initial_term + 1);
  28. sleep_election_timeouts(2);
  29. let (second_term, _) = cfg.leader_start(leader, 400).unwrap();
  30. assert_eq!(first_term, second_term);
  31. let index = cfg.one(500, 3, false)?;
  32. assert_eq!(index, 5);
  33. Ok(())
  34. }