Limit federation send retry interval to one hour

This commit is contained in:
Felix Ableitner 2024-04-05 11:11:58 +02:00
parent a1d632e582
commit 3f9e182110
3 changed files with 30 additions and 6 deletions

View file

@ -27,7 +27,7 @@ pub extern crate lemmy_utils;
pub use lemmy_utils::LemmyErrorType; pub use lemmy_utils::LemmyErrorType;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::{cmp::min, time::Duration};
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
#[cfg_attr(feature = "full", derive(ts_rs::TS))] #[cfg_attr(feature = "full", derive(ts_rs::TS))]
@ -43,7 +43,31 @@ impl Default for SuccessResponse {
} }
} }
/// how long to sleep based on how many retries have already happened // TODO: use from_hours once stabilized
// https://github.com/rust-lang/rust/issues/120301
const HOUR: Duration = Duration::from_secs(3600);
/// Calculate how long to sleep until next federation send based on how many
/// retries have already happened. Uses exponential backoff with maximum of one hour.
pub fn federate_retry_sleep_duration(retry_count: i32) -> Duration { pub fn federate_retry_sleep_duration(retry_count: i32) -> Duration {
Duration::from_secs_f64(2.0_f64.powf(f64::from(retry_count))) let pow = 2.0_f64.powf(retry_count.into());
let pow = Duration::from_secs_f64(pow);
min(HOUR, pow)
}
#[cfg(test)]
pub(crate) mod tests {
use super::*;
#[test]
fn test_federate_retry_sleep_duration() {
let s = |secs| Duration::from_secs(secs);
assert_eq!(s(1), federate_retry_sleep_duration(0));
assert_eq!(s(2), federate_retry_sleep_duration(1));
assert_eq!(s(4), federate_retry_sleep_duration(2));
assert_eq!(s(8), federate_retry_sleep_duration(3));
assert_eq!(s(16), federate_retry_sleep_duration(4));
assert_eq!(s(1024), federate_retry_sleep_duration(10));
assert_eq!(s(3600), federate_retry_sleep_duration(20));
}
} }

View file

@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1.6 # syntax=docker/dockerfile:1.6
ARG RUST_VERSION=1.76 ARG RUST_VERSION=1.77
ARG CARGO_BUILD_FEATURES=default ARG CARGO_BUILD_FEATURES=default
ARG RUST_RELEASE_MODE=debug ARG RUST_RELEASE_MODE=debug

View file

@ -6,7 +6,7 @@ CWD="$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
cd $CWD/../ cd $CWD/../
PACKAGE="$1" PACKAGE="$1"
echo "$PACKAGE" TEST="$2"
source scripts/start_dev_db.sh source scripts/start_dev_db.sh
@ -17,7 +17,7 @@ export RUST_BACKTRACE=1
if [ -n "$PACKAGE" ]; if [ -n "$PACKAGE" ];
then then
cargo test -p $PACKAGE --all-features --no-fail-fast cargo test -p $PACKAGE --all-features --no-fail-fast $TEST
else else
cargo test --workspace --no-fail-fast cargo test --workspace --no-fail-fast
fi fi