From 4a95fc0f2d4e9759b54852d95a17f128f4756cf6 Mon Sep 17 00:00:00 2001 From: Chris Farhood Date: Sat, 25 Apr 2026 14:31:58 +0000 Subject: [PATCH] fix: exponential backoff on log stream reconnect (FAR-70) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace fixed 3s reconnect delay with exponential backoff (3s → 6s → 12s → 24s → capped at 30s) to avoid hammering the K8s API server during prolonged network blips while remaining responsive during brief disconnects. Co-Authored-By: Paperclip --- src/server/execute.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/server/execute.ts b/src/server/execute.ts index e044794..7b9ba36 100644 --- a/src/server/execute.ts +++ b/src/server/execute.ts @@ -17,6 +17,7 @@ import { Writable } from "node:stream"; const POLL_INTERVAL_MS = 2000; const KEEPALIVE_INTERVAL_MS = 15_000; const LOG_STREAM_RECONNECT_DELAY_MS = 3_000; +const LOG_STREAM_RECONNECT_MAX_DELAY_MS = 30_000; const MAX_LOG_RECONNECT_ATTEMPTS = 50; // Upper bound on how long streamPodLogsOnce will wait after stopSignal fires // before force-returning, even if logApi.log has not yet resolved. Defensive @@ -283,8 +284,14 @@ async function streamPodLogs( if (stopSignal?.stopped) break; - // Brief pause before reconnecting to avoid tight loops. - await new Promise((resolve) => setTimeout(resolve, LOG_STREAM_RECONNECT_DELAY_MS)); + // Exponential backoff before reconnecting: start at 3s, double each + // attempt, cap at 30s. Avoids hammering the API server during prolonged + // network hiccups while staying responsive for brief disconnects. + const backoffMs = Math.min( + LOG_STREAM_RECONNECT_MAX_DELAY_MS, + LOG_STREAM_RECONNECT_DELAY_MS * 2 ** (attempt - 1), + ); + await new Promise((resolve) => setTimeout(resolve, backoffMs)); } // Flush any buffered partial line so the final assistant/result chunk @@ -1059,6 +1066,7 @@ export async function execute(ctx: AdapterExecutionContext): Promise