From 46d4cdf313cd2696ae08e9b6ec89fa8412090f62 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 9 Sep 2025 15:12:59 -0500 Subject: [PATCH 1/3] feat: WIP on retry logic --- .../Discord/Gateway/DiscordGatewayClient.cs | 19 ++++++++++++++++++- src/src/StevesBot.Worker/Usings.cs | 3 ++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs b/src/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs index 789264d..dc9f248 100644 --- a/src/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs +++ b/src/src/StevesBot.Worker/Discord/Gateway/DiscordGatewayClient.cs @@ -1,3 +1,4 @@ + using Activity = StevesBot.Worker.Discord.Gateway.Events.Data.Activity; namespace StevesBot.Worker.Discord.Gateway; @@ -674,7 +675,23 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient throw new DiscordGatewayClientException("WebSocket is already open. Cannot connect."); } - await _webSocket.ConnectAsync(uri, cancellationToken); + var connected = false; + var attempts = 0; + var delay = TimeSpan.FromSeconds(0); + + 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 + } + } } private static Uri BuildUri(string url) diff --git a/src/src/StevesBot.Worker/Usings.cs b/src/src/StevesBot.Worker/Usings.cs index 7dce256..b6ca0ac 100644 --- a/src/src/StevesBot.Worker/Usings.cs +++ b/src/src/StevesBot.Worker/Usings.cs @@ -1,3 +1,4 @@ +global using System.Net; global using System.Net.WebSockets; global using System.Reflection; global using System.Text; @@ -19,4 +20,4 @@ global using StevesBot.Worker.Discord.Gateway.Events.Data; global using StevesBot.Worker.Handlers; global using StevesBot.Worker.Telemetry; global using StevesBot.Worker.Threading; -global using StevesBot.Worker.WebSockets; \ No newline at end of file +global using StevesBot.Worker.WebSockets; 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 2/3] 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++; } } } From e427c5936f77f44b2fb22b9c47ad0e4551bfcdf9 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Thu, 11 Sep 2025 10:39:44 -0500 Subject: [PATCH 3/3] chore: run dotnet format --- src/src/StevesBot.Worker/Usings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/src/StevesBot.Worker/Usings.cs b/src/src/StevesBot.Worker/Usings.cs index b6ca0ac..70e9b5f 100644 --- a/src/src/StevesBot.Worker/Usings.cs +++ b/src/src/StevesBot.Worker/Usings.cs @@ -20,4 +20,4 @@ global using StevesBot.Worker.Discord.Gateway.Events.Data; global using StevesBot.Worker.Handlers; global using StevesBot.Worker.Telemetry; global using StevesBot.Worker.Threading; -global using StevesBot.Worker.WebSockets; +global using StevesBot.Worker.WebSockets; \ No newline at end of file