From 96ba7e5fe7e8568a44d3f29f242ba4b40ad3b8b0 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:44:46 -0500 Subject: [PATCH] fix: implement retry logic for establishing initial websocket connection with an expontential backoff --- .../Discord/Gateway/DiscordGatewayClient.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs b/src/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs index dc9f248..52719ae 100644 --- a/src/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs +++ b/src/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs @@ -677,19 +677,30 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient var connected = false; var attempts = 0; - var delay = TimeSpan.FromSeconds(0); + var delay = TimeSpan.FromSeconds(1); while (connected is false) { try { - await Task.Delay(delay, cancellationToken); await _webSocket.ConnectAsync(uri, cancellationToken); connected = true; } catch (Exception e) when (e is WebSocketException) { - // TODO: Implement exponential backoff retry strategy + var currentDelay = (int)(delay.TotalMilliseconds * Math.Pow(2, attempts)); + + _logger.LogWarning( + e, + "Failed to connect to {Uri} on {Attempt} attempt. Waiting for {Delay}ms before trying again", + uri, + attempts, + currentDelay + ); + + await Task.Delay(currentDelay, cancellationToken); + + attempts++; } } }