From aaf370f33a9f7d09e629c5288f4754130963f95d Mon Sep 17 00:00:00 2001 From: Adrien Guillo Date: Wed, 24 Dec 2025 08:53:48 +0100 Subject: [PATCH] Fix `test_readiness_updates` flaky test --- quickwit/quickwit-common/src/lib.rs | 26 ++++++++++++++++++++++++++ quickwit/quickwit-serve/src/lib.rs | 8 +++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/quickwit/quickwit-common/src/lib.rs b/quickwit/quickwit-common/src/lib.rs index 0882d7f8ee6..0f3af2bc5ba 100644 --- a/quickwit/quickwit-common/src/lib.rs +++ b/quickwit/quickwit-common/src/lib.rs @@ -188,6 +188,32 @@ pub fn no_color() -> bool { matches!(env::var("NO_COLOR"), Ok(value) if !value.is_empty()) } +#[macro_export] +macro_rules! assert_eventually { + ($cond:expr, $timeout:expr, $interval:expr) => { + let start = std::time::Instant::now(); + loop { + if $cond { + break; + } + if start.elapsed() > $timeout { + panic!( + "assertion failed: condition `{}` never became true within {} ms", + stringify!($cond), + $timeout.as_millis() + ); + } + tokio::time::sleep($interval).await; + } + }; + ($cond:expr, $timeout:expr) => { + assert_eventually!($cond, $timeout, std::time::Duration::from_millis(50)); + }; + ($cond:expr) => { + assert_eventually!($cond, std::time::Duration::from_secs(1)); + }; +} + #[macro_export] macro_rules! ignore_error_kind { ($kind:path, $expr:expr) => { diff --git a/quickwit/quickwit-serve/src/lib.rs b/quickwit/quickwit-serve/src/lib.rs index 29ba227c039..ca4520ff0ce 100644 --- a/quickwit/quickwit-serve/src/lib.rs +++ b/quickwit/quickwit-serve/src/lib.rs @@ -1353,8 +1353,8 @@ async fn check_cluster_configuration( #[cfg(test)] mod tests { use quickwit_cluster::{ChannelTransport, ClusterNode, create_cluster_for_test}; - use quickwit_common::ServiceStream; use quickwit_common::uri::Uri; + use quickwit_common::{ServiceStream, assert_eventually}; use quickwit_config::SearcherConfig; use quickwit_metastore::{IndexMetadata, metastore_for_test}; use quickwit_proto::indexing::IndexingTask; @@ -1472,16 +1472,14 @@ mod tests { metastore_readiness_tx.send(true).unwrap(); ingester_status_tx.send(IngesterStatus::Ready).unwrap(); - tokio::time::sleep(Duration::from_millis(25)).await; - assert!(cluster.is_self_node_ready().await); + assert_eventually!(cluster.is_self_node_ready().await); let request = tonic::Request::new(HealthCheckRequest::default()); let response = health_client.check(request).await.unwrap().into_inner(); assert_eq!(response.status(), ServingStatus::Serving.into()); metastore_readiness_tx.send(false).unwrap(); - tokio::time::sleep(Duration::from_millis(25)).await; - assert!(!cluster.is_self_node_ready().await); + assert_eventually!(!cluster.is_self_node_ready().await); let request = tonic::Request::new(HealthCheckRequest::default()); let response = health_client.check(request).await.unwrap().into_inner();