From 8a4858a313eeac8cbb510b2417d79f2d337db7fd Mon Sep 17 00:00:00 2001 From: Jack Kingsman Date: Fri, 10 Apr 2026 15:44:50 -0700 Subject: [PATCH] Don't consume DM resend attempt on busy radio --- app/services/message_send.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/services/message_send.py b/app/services/message_send.py index dce3124..299f5a3 100644 --- a/app/services/message_send.py +++ b/app/services/message_send.py @@ -421,7 +421,8 @@ async def _retry_direct_message_until_acked( message_repository, ) -> None: next_wait_timeout_ms = wait_timeout_ms - for attempt in range(1, DM_SEND_MAX_ATTEMPTS): + attempt = 1 + while attempt < DM_SEND_MAX_ATTEMPTS: await sleep_fn((next_wait_timeout_ms / 1000) * DM_RETRY_WAIT_MARGIN) if await _is_message_acked(message_id=message_id, message_repository=message_repository): return @@ -463,6 +464,14 @@ async def _retry_direct_message_until_acked( timestamp=sender_timestamp, attempt=attempt, ) + except RadioOperationBusyError: + logger.debug( + "Radio busy during DM retry attempt %d/%d for %s, will retry without consuming attempt", + attempt + 1, + DM_SEND_MAX_ATTEMPTS, + contact.public_key[:12], + ) + continue except Exception: logger.exception( "Background DM retry attempt %d/%d failed for %s", @@ -470,6 +479,7 @@ async def _retry_direct_message_until_acked( DM_SEND_MAX_ATTEMPTS, contact.public_key[:12], ) + attempt += 1 continue if result is None: @@ -479,6 +489,7 @@ async def _retry_direct_message_until_acked( DM_SEND_MAX_ATTEMPTS, contact.public_key[:12], ) + attempt += 1 continue if result.type == EventType.ERROR: @@ -489,6 +500,7 @@ async def _retry_direct_message_until_acked( contact.public_key[:12], result.payload, ) + attempt += 1 continue if await _is_message_acked(message_id=message_id, message_repository=message_repository): @@ -516,6 +528,8 @@ async def _retry_direct_message_until_acked( if ack_count > 0: return + attempt += 1 + async def send_direct_message_to_contact( *,