From b4ec1e9d3cbc58f68c3733061c11c55700ff3018 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Mon, 14 Oct 2024 03:58:25 +0000 Subject: [PATCH] add federation client for select high-timeout requests Signed-off-by: Jason Volk --- src/api/client/membership.rs | 4 ++-- src/core/config/mod.rs | 2 +- src/service/client/mod.rs | 9 ++++++++- src/service/rooms/event_handler/mod.rs | 2 +- src/service/sending/mod.rs | 11 +++++++++++ 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/api/client/membership.rs b/src/api/client/membership.rs index 2fa34ff7..31fd9076 100644 --- a/src/api/client/membership.rs +++ b/src/api/client/membership.rs @@ -775,7 +775,7 @@ async fn join_room_by_id_helper_remote( let send_join_response = services .sending - .send_federation_request(&remote_server, send_join_request) + .send_synapse_request(&remote_server, send_join_request) .await?; info!("send_join finished"); @@ -1154,7 +1154,7 @@ async fn join_room_by_id_helper_local( let send_join_response = services .sending - .send_federation_request( + .send_synapse_request( &remote_server, federation::membership::create_join_event::v2::Request { room_id: room_id.to_owned(), diff --git a/src/core/config/mod.rs b/src/core/config/mod.rs index 114c6e76..02b277d0 100644 --- a/src/core/config/mod.rs +++ b/src/core/config/mod.rs @@ -1775,7 +1775,7 @@ fn default_well_known_conn_timeout() -> u64 { 6 } fn default_well_known_timeout() -> u64 { 10 } -fn default_federation_timeout() -> u64 { 300 } +fn default_federation_timeout() -> u64 { 25 } fn default_federation_idle_timeout() -> u64 { 25 } diff --git a/src/service/client/mod.rs b/src/service/client/mod.rs index b21f9dab..f9a89e99 100644 --- a/src/service/client/mod.rs +++ b/src/service/client/mod.rs @@ -11,6 +11,7 @@ pub struct Service { pub extern_media: reqwest::Client, pub well_known: reqwest::Client, pub federation: reqwest::Client, + pub synapse: reqwest::Client, pub sender: reqwest::Client, pub appservice: reqwest::Client, pub pusher: reqwest::Client, @@ -48,12 +49,18 @@ impl crate::Service for Service { federation: base(config)? .dns_resolver(resolver.resolver.hooked.clone()) .read_timeout(Duration::from_secs(config.federation_timeout)) - .timeout(Duration::from_secs(config.federation_timeout)) .pool_max_idle_per_host(config.federation_idle_per_host.into()) .pool_idle_timeout(Duration::from_secs(config.federation_idle_timeout)) .redirect(redirect::Policy::limited(3)) .build()?, + synapse: base(config)? + .dns_resolver(resolver.resolver.hooked.clone()) + .read_timeout(Duration::from_secs(305)) + .pool_max_idle_per_host(0) + .redirect(redirect::Policy::limited(3)) + .build()?, + sender: base(config)? .dns_resolver(resolver.resolver.hooked.clone()) .read_timeout(Duration::from_secs(config.sender_timeout)) diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs index 8448404b..0ffd9659 100644 --- a/src/service/rooms/event_handler/mod.rs +++ b/src/service/rooms/event_handler/mod.rs @@ -1016,7 +1016,7 @@ impl Service { let res = self .services .sending - .send_federation_request( + .send_synapse_request( origin, get_room_state_ids::v1::Request { room_id: room_id.to_owned(), diff --git a/src/service/sending/mod.rs b/src/service/sending/mod.rs index 5970c383..63c5e655 100644 --- a/src/service/sending/mod.rs +++ b/src/service/sending/mod.rs @@ -245,6 +245,7 @@ impl Service { .await } + /// Sends a request to a federation server #[tracing::instrument(skip_all, name = "request")] pub async fn send_federation_request(&self, dest: &ServerName, request: T) -> Result where @@ -254,6 +255,16 @@ impl Service { self.send(client, dest, request).await } + /// Like send_federation_request() but with a very large timeout + #[tracing::instrument(skip_all, name = "synapse")] + pub async fn send_synapse_request(&self, dest: &ServerName, request: T) -> Result + where + T: OutgoingRequest + Debug + Send, + { + let client = &self.services.client.synapse; + self.send(client, dest, request).await + } + /// Sends a request to an appservice /// /// Only returns None if there is no url specified in the appservice