From ee82509467e533e2f321d8bfeea8696ce265482d Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Tue, 10 Mar 2026 14:35:42 -0500 Subject: [PATCH] fix: reset reconnect backoff after successful connection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CRITICAL: The agent never reset its exponential backoff delay after successful connections, causing permanent 60s reconnect delays after multiple deploys. Root cause: - retryDelay started at 1s, doubled to 60s cap on each disconnect - Never reset when connection succeeded - After ~6 deploys, agent permanently waited 60s between reconnects Fixes: 1. Reset backoff to 1s after session runs for 30s+ (indicates stable connection) 2. Reduce max retry from 60s → 10s (60s is too long for production) Impact: - After Phoenix deploy, agent reconnects within seconds instead of minutes - Exponential backoff still prevents connection storms on real failures - Typical reconnect sequence: 1s → 2s → 4s → 8s → 10s (cap) --- agent.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/agent.go b/agent.go index 62c64f6..c0f37a0 100644 --- a/agent.go +++ b/agent.go @@ -42,7 +42,8 @@ type channelMsg struct { func runAgent(ctx context.Context, wsURL, token string) { baseURL := strings.TrimRight(wsURL, "/") retryDelay := time.Second - maxRetry := 60 * time.Second + maxRetry := 10 * time.Second + const successfulConnectionThreshold = 30 * time.Second for { select { @@ -51,7 +52,18 @@ func runAgent(ctx context.Context, wsURL, token string) { default: } + sessionStart := time.Now() err := runSession(ctx, baseURL, token) + sessionDuration := time.Since(sessionStart) + + // Reset backoff if session ran successfully for a while (indicates stable connection) + if sessionDuration >= successfulConnectionThreshold { + slog.Debug("resetting reconnect backoff after successful session", + "duration", sessionDuration, + "previous_delay", retryDelay) + retryDelay = time.Second + } + if ctx.Err() != nil { return }