From 3c78f4121e9670daed4a55211086c155f24f09c6 Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Tue, 30 Sep 2025 12:57:26 +0200 Subject: [PATCH 1/4] Raise timeout to 30secs --- crates/meilisearch/src/search/federated/proxy.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/meilisearch/src/search/federated/proxy.rs b/crates/meilisearch/src/search/federated/proxy.rs index ac8cd2491..8974297d7 100644 --- a/crates/meilisearch/src/search/federated/proxy.rs +++ b/crates/meilisearch/src/search/federated/proxy.rs @@ -105,7 +105,7 @@ pub async fn proxy_search( let search_api_key = node.search_api_key.as_deref(); - let max_deadline = std::time::Instant::now() + std::time::Duration::from_secs(5); + let max_deadline = std::time::Instant::now() + std::time::Duration::from_secs(30); let deadline = if let Some(deadline) = params.deadline { std::time::Instant::min(deadline, max_deadline) From 6029677eec5e9e2a1bfc41a64e5d8871e32b0904 Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Tue, 30 Sep 2025 13:53:48 +0200 Subject: [PATCH 2/4] Also raise the global deadline --- crates/meilisearch/src/search/federated/perform.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/meilisearch/src/search/federated/perform.rs b/crates/meilisearch/src/search/federated/perform.rs index bf2c99a55..5ceb2a64c 100644 --- a/crates/meilisearch/src/search/federated/perform.rs +++ b/crates/meilisearch/src/search/federated/perform.rs @@ -46,7 +46,7 @@ pub async fn perform_federated_search( features.check_network("Performing a remote federated search")?; } let before_search = std::time::Instant::now(); - let deadline = before_search + std::time::Duration::from_secs(9); + let deadline = before_search + std::time::Duration::from_secs(30); let required_hit_count = federation.limit + federation.offset; let retrieve_vectors = queries.iter().any(|q| q.retrieve_vectors); From 70aa768d48f733e9c3ed26ef09bbbb46736a2ff0 Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Tue, 30 Sep 2025 14:05:26 +0200 Subject: [PATCH 3/4] Update ignored test --- crates/meilisearch/tests/search/multi/proxy.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/meilisearch/tests/search/multi/proxy.rs b/crates/meilisearch/tests/search/multi/proxy.rs index 8eae5f7f8..a763ae705 100644 --- a/crates/meilisearch/tests/search/multi/proxy.rs +++ b/crates/meilisearch/tests/search/multi/proxy.rs @@ -2866,7 +2866,8 @@ async fn error_remote_timeout() { snapshot!(json_string!(response), @r###" { "self": "ms0", - "remotes": {} + "remotes": {}, + "sharding": false } "###); let (response, code) = ms1.set_network(json!({"self": "ms1"})).await; @@ -2874,7 +2875,8 @@ async fn error_remote_timeout() { snapshot!(json_string!(response), @r###" { "self": "ms1", - "remotes": {} + "remotes": {}, + "sharding": false } "###); @@ -2895,7 +2897,7 @@ async fn error_remote_timeout() { let rms0 = LocalMeili::new(ms0.clone()).await; let rms1 = LocalMeili::with_params( ms1.clone(), - LocalMeiliParams { delay: Some(std::time::Duration::from_secs(6)), ..Default::default() }, + LocalMeiliParams { delay: Some(std::time::Duration::from_secs(31)), ..Default::default() }, ) .await; From 72b4b414438b28681e727131b1a21e769d8b6e25 Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Mon, 6 Oct 2025 17:50:20 +0200 Subject: [PATCH 4/4] Read `MEILI_EXPERIMENTAL_REMOTE_SEARCH_TIMEOUT_SECONDS` to override the default timeout in remote federated search --- crates/meilisearch/src/search/federated/perform.rs | 8 +++++++- crates/meilisearch/src/search/federated/proxy.rs | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/meilisearch/src/search/federated/perform.rs b/crates/meilisearch/src/search/federated/perform.rs index 5ceb2a64c..bef2a0614 100644 --- a/crates/meilisearch/src/search/federated/perform.rs +++ b/crates/meilisearch/src/search/federated/perform.rs @@ -46,7 +46,13 @@ pub async fn perform_federated_search( features.check_network("Performing a remote federated search")?; } let before_search = std::time::Instant::now(); - let deadline = before_search + std::time::Duration::from_secs(30); + + let timeout = std::env::var("MEILI_EXPERIMENTAL_REMOTE_SEARCH_TIMEOUT_SECONDS") + .ok() + .map(|p| p.parse().unwrap()) + .unwrap_or(25); + + let deadline = before_search + std::time::Duration::from_secs(timeout); let required_hit_count = federation.limit + federation.offset; let retrieve_vectors = queries.iter().any(|q| q.retrieve_vectors); diff --git a/crates/meilisearch/src/search/federated/proxy.rs b/crates/meilisearch/src/search/federated/proxy.rs index 8974297d7..67594f645 100644 --- a/crates/meilisearch/src/search/federated/proxy.rs +++ b/crates/meilisearch/src/search/federated/proxy.rs @@ -105,7 +105,12 @@ pub async fn proxy_search( let search_api_key = node.search_api_key.as_deref(); - let max_deadline = std::time::Instant::now() + std::time::Duration::from_secs(30); + let timeout = std::env::var("MEILI_EXPERIMENTAL_REMOTE_SEARCH_TIMEOUT_SECONDS") + .ok() + .map(|p| p.parse().unwrap()) + .unwrap_or(25); + + let max_deadline = std::time::Instant::now() + std::time::Duration::from_secs(timeout); let deadline = if let Some(deadline) = params.deadline { std::time::Instant::min(deadline, max_deadline)