From 46e7520180ef169147777d62a9cee84da7f6bbfe Mon Sep 17 00:00:00 2001 From: timedout Date: Tue, 11 Aug 2026 17:31:43 +0100 Subject: [PATCH] fix(sender): Don't attempt to send concurrent transactions to a remote --- src/service/sending/sender.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/service/sending/sender.rs b/src/service/sending/sender.rs index cd55bc084..18cd6a33a 100644 --- a/src/service/sending/sender.rs +++ b/src/service/sending/sender.rs @@ -398,18 +398,25 @@ fn should_attempt_send( dest: &Destination, statuses: &mut CurTransactionStatus, ) -> Result<(bool, bool)> { + let (mut allow, mut retry) = (true, false); if let Destination::Federation(server_name) = dest { - let status = statuses + statuses .entry(dest.clone()) + .and_modify(|e| match e { + | TransactionStatus::Running | TransactionStatus::Retrying(_) => { + allow = false; // already running + }, + | TransactionStatus::Failed(tries, _) => { + *e = TransactionStatus::Retrying(*tries); + retry = true; + }, + }) .or_insert(TransactionStatus::Running); - let retry = matches!(status, TransactionStatus::Failed(_, _)); return match self.services.federation.retry_after(server_name) { - | None => Ok((true, retry)), - | Some(t) => Ok((t.as_millis() > 0, retry)), + | None => Ok((allow, retry)), + | Some(t) => Ok((t.as_millis() > 0 && allow, retry)), }; } - - let (mut allow, mut retry) = (true, false); statuses .entry(dest.clone()) .and_modify(|e| match e {