diff --git a/conduwuit-example.toml b/conduwuit-example.toml index 560999069..a710a9b9c 100644 --- a/conduwuit-example.toml +++ b/conduwuit-example.toml @@ -544,9 +544,28 @@ # #sender_idle_timeout = 180 -# Federation sender transaction retry backoff limit (seconds). +# Federation sender retry backoff base (seconds). # -#sender_retry_backoff_limit = 86400 +# This period will be doubled for each failed federation request until +# either the remote server becomes healthy, or the value is clamped to +# `sender_retry_backoff_limit`. +# +#sender_retry_backoff_base = 60 + +# Federation sender retry backoff limit (seconds). +# +# Defaults to one week. Requests will never stop being retried if their +# backoff period exceeds this value, however the maximum amount of time +# between each request will instead be clamped at this value. +# +# The backoff period is reset if a successful request is made, or +# continuwuity receives a request from the server that is being backed off +# from. +# +# It is not recommended to lower this value below 48 hours or above +# 1 year. +# +#sender_retry_backoff_limit = 806400 # Appservice URL request connection timeout. Defaults to 35 seconds as # generally appservices are hosted within the same network. diff --git a/src/core/config/mod.rs b/src/core/config/mod.rs index f1e4d323c..07ae7d9f2 100644 --- a/src/core/config/mod.rs +++ b/src/core/config/mod.rs @@ -682,9 +682,30 @@ pub struct Config { #[serde(default = "default_sender_idle_timeout")] pub sender_idle_timeout: u64, - /// Federation sender transaction retry backoff limit (seconds). + /// Federation sender retry backoff base (seconds). /// - /// default: 86400 + /// This period will be doubled for each failed federation request until + /// either the remote server becomes healthy, or the value is clamped to + /// `sender_retry_backoff_limit`. + /// + /// default: 60 + #[serde(default = "default_sender_retry_backoff_base")] + pub sender_retry_backoff_base: u64, + + /// Federation sender retry backoff limit (seconds). + /// + /// Defaults to one week. Requests will never stop being retried if their + /// backoff period exceeds this value, however the maximum amount of time + /// between each request will instead be clamped at this value. + /// + /// The backoff period is reset if a successful request is made, or + /// continuwuity receives a request from the server that is being backed off + /// from. + /// + /// It is not recommended to lower this value below 48 hours or above + /// 1 year. + /// + /// default: 806400 #[serde(default = "default_sender_retry_backoff_limit")] pub sender_retry_backoff_limit: u64, @@ -2967,6 +2988,8 @@ fn default_sender_timeout() -> u64 { 180 } fn default_sender_idle_timeout() -> u64 { 180 } +fn default_sender_retry_backoff_base() -> u64 { 60 } + fn default_sender_retry_backoff_limit() -> u64 { 86400 } fn default_appservice_timeout() -> u64 { 35 } diff --git a/src/service/federation/mod.rs b/src/service/federation/mod.rs index c46d34a40..895e9f4a8 100644 --- a/src/service/federation/mod.rs +++ b/src/service/federation/mod.rs @@ -91,7 +91,7 @@ impl Service { return; } - let min = Duration::from_secs(self.services.server.config.sender_timeout); + let min = Duration::from_secs(self.services.server.config.sender_retry_backoff_base); let max = Duration::from_secs(self.services.server.config.sender_retry_backoff_limit); *retries = retries.saturating_add(1); diff --git a/src/service/sending/sender.rs b/src/service/sending/sender.rs index d64002e9c..6f285c24c 100644 --- a/src/service/sending/sender.rs +++ b/src/service/sending/sender.rs @@ -410,7 +410,7 @@ impl Service { .entry(dest.clone()) .and_modify(|e| match e { | TransactionStatus::Failed(tries, time) => { - let min = Duration::from_secs(self.server.config.sender_timeout); + let min = Duration::from_secs(self.server.config.sender_retry_backoff_base); let max = Duration::from_secs(self.server.config.sender_retry_backoff_limit); if should_continue_backoff(min, max, time.elapsed(), *tries) && !matches!(dest, Destination::Appservice(_))