From e49c4073f82332d0c6f0580352f01b763418d89b Mon Sep 17 00:00:00 2001 From: OpenClaw Date: Fri, 20 Feb 2026 08:03:01 +0000 Subject: [PATCH] fix: stagger browser restarts to prevent simultaneous QUEUE_FULL - Only allow one browser to restart at a time in acquirePage() - Stagger initial lastRestartTime by RESTART_AFTER_MS/BROWSER_COUNT per instance --- src/services/browser.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/services/browser.ts b/src/services/browser.ts index 01a010e..f416221 100644 --- a/src/services/browser.ts +++ b/src/services/browser.ts @@ -56,9 +56,11 @@ function pickInstance(): BrowserInstance | null { } export async function acquirePage(): Promise<{ page: Page; instance: BrowserInstance }> { + const anyRestarting = instances.some(i => i.restarting); for (const inst of instances) { - if (!inst.restarting && (inst.jobCount >= RESTART_AFTER || Date.now() - inst.lastRestartTime >= RESTART_AFTER_MS)) { + if (!inst.restarting && !anyRestarting && (inst.jobCount >= RESTART_AFTER || Date.now() - inst.lastRestartTime >= RESTART_AFTER_MS)) { scheduleRestart(inst); + break; // only restart one at a time } } @@ -130,7 +132,8 @@ export async function initBrowser(): Promise { args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-gpu", "--disable-dev-shm-usage"], }); const pages = await createPages(browser, PAGES_PER_BROWSER); - instances.push({ browser, availablePages: pages, jobCount: 0, lastRestartTime: Date.now(), restarting: false, id: i }); + const staggerMs = i * (RESTART_AFTER_MS / BROWSER_COUNT); + instances.push({ browser, availablePages: pages, jobCount: 0, lastRestartTime: Date.now() + staggerMs, restarting: false, id: i }); } logger.info(`Browser pool ready (${BROWSER_COUNT}×${PAGES_PER_BROWSER} = ${BROWSER_COUNT * PAGES_PER_BROWSER} pages)`); }