diff --git a/crates/meilisearch/src/search/federated/perform.rs b/crates/meilisearch/src/search/federated/perform.rs index bf2c99a55..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(9); + + 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 ac8cd2491..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(5); + 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) 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;