Explorar o código

Add a liveness test in which the previous leader is connected to one follower.

Jing Yang %!s(int64=3) %!d(string=hai) anos
pai
achega
ed7ed114bb
Modificáronse 2 ficheiros con 42 adicións e 0 borrados
  1. 6 0
      test_configs/src/raft/config.rs
  2. 36 0
      tests/prevote_tests.rs

+ 6 - 0
test_configs/src/raft/config.rs

@@ -277,6 +277,12 @@ impl Config {
         network.set_enable_client(Self::client_name(two, one), true);
     }
 
+    pub fn disconnect_pair(&self, one: usize, two: usize) {
+        let mut network = self.network.lock();
+        network.set_enable_client(Self::client_name(one, two), false);
+        network.set_enable_client(Self::client_name(two, one), false);
+    }
+
     pub fn crash1(&self, index: usize) {
         self.disconnect(index);
 

+ 36 - 0
tests/prevote_tests.rs

@@ -9,6 +9,7 @@ fn no_disruptive_rejoin() -> config::Result<()> {
     const SERVERS: usize = 5;
     let cfg = make_config!(SERVERS, false);
     defer!(cfg.cleanup());
+
     let initial_leader = cfg.check_one_leader()?;
     cfg.one(100, SERVERS, false)?;
     let initial_term =
@@ -48,3 +49,38 @@ fn no_disruptive_rejoin() -> config::Result<()> {
 
     Ok(())
 }
+
+#[test]
+fn disruptive_liveness() -> config::Result<()> {
+    const SERVERS: usize = 5;
+    let cfg = make_config!(SERVERS, false);
+    defer!(cfg.cleanup());
+
+    let initial_leader = cfg.check_one_leader()?;
+    cfg.one(100, SERVERS, false)?;
+    cfg.check_terms()?.expect("Servers should agree on term");
+
+    //  3 <--> 2      4
+    //  ^      ^
+    //  |      |
+    //  |      v
+    //  -----> 1 <--> 0
+
+    // Disconnect 4
+    let disruptor = (initial_leader + 4) % SERVERS;
+    cfg.disconnect(disruptor);
+
+    // Disconnect (0, 2) and (0, 3)
+    cfg.disconnect_pair(initial_leader, (initial_leader + 2) % SERVERS);
+    cfg.disconnect_pair(initial_leader, (initial_leader + 3) % SERVERS);
+
+    sleep_election_timeouts(1);
+
+    let leader = cfg.check_one_leader()?;
+    cfg.one(200, 3, false)?;
+
+    assert_ne!(initial_leader, leader);
+    assert_ne!(disruptor, leader);
+
+    Ok(())
+}