From e3a6a756cad88018f7c95bbdc11a197534cedbd6 Mon Sep 17 00:00:00 2001 From: drdr xp Date: Tue, 22 Jun 2021 01:29:53 +0800 Subject: [PATCH] test: dynamic_membership: use wait() instead of sleep to reduce test time --- async-raft/tests/dynamic_membership.rs | 40 ++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/async-raft/tests/dynamic_membership.rs b/async-raft/tests/dynamic_membership.rs index 637049262..72f5ec2d3 100644 --- a/async-raft/tests/dynamic_membership.rs +++ b/async-raft/tests/dynamic_membership.rs @@ -89,8 +89,28 @@ async fn dynamic_membership() -> Result<()> { // Isolate old leader and assert that a new leader takes over. tracing::info!("--- isolating master node 0"); router.isolate_node(0).await; - sleep(Duration::from_secs(5)).await; // Wait for election and for everything to stabilize (this is way longer than needed). - router.assert_stable_cluster(Some(2), Some(4)).await; + router + .wait_for_metrics( + &1, + |x| x.current_leader.is_some() && x.current_leader.unwrap() != 0, + Some(Duration::from_millis(1000)), + "wait for new leader", + ) + .await?; + + // need some time to stabilize. + // TODO: it can not be sure that no new leader is elected after a leader detected on node-1 + // Wait for election and for everything to stabilize (this is way longer than needed). + sleep(Duration::from_millis(1000)).await; + + let metrics = &router.latest_metrics().await[1]; + let term = metrics.current_term; + let applied = metrics.last_applied; + let leader_id = metrics.current_leader; + + router + .assert_stable_cluster(Some(term), Some(applied)) + .await; let leader = router.leader().await.expect("expected new leader"); assert!( leader != 0, @@ -99,9 +119,19 @@ async fn dynamic_membership() -> Result<()> { // Restore isolated node. router.restore_node(0).await; - sleep(Duration::from_secs(5)).await; // Wait for election and for everything to stabilize (this is way longer than needed). - router.assert_stable_cluster(Some(2), Some(4)).await; // We should still be in term 2, as leaders should - // not be deposed when they are not missing heartbeats. + router + .wait_for_metrics( + &0, + |x| x.current_leader == leader_id && x.last_applied == applied, + Some(Duration::from_millis(1000)), + "wait for restored node-0 to sync", + ) + .await?; + + router + .assert_stable_cluster(Some(term), Some(applied)) + .await; + let current_leader = router .leader() .await