From fef4b840f36deb5fcab847b33e8d0791886e54c9 Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Tue, 7 Jul 2026 06:57:40 +0000 Subject: [PATCH] fix(selfhost): improve orb-relay-drain robustness against broker degradation --- src/orb/broker-client.ts | 2 +- src/server.ts | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/orb/broker-client.ts b/src/orb/broker-client.ts index 003e599bf6..e39f6115b2 100644 --- a/src/orb/broker-client.ts +++ b/src/orb/broker-client.ts @@ -248,7 +248,7 @@ export async function drainOrbRelay( const base = orbBrokerBaseUrl(env); const res = await fetchImpl(`${base}/v1/orb/relay/pull`, { method: "POST", - headers: { authorization: `Bearer ${env.ORB_ENROLLMENT_SECRET}`, "content-type": "application/json" }, + signal: AbortSignal.timeout(30_000), body: JSON.stringify({ ack }), signal: AbortSignal.timeout(15_000), }); diff --git a/src/server.ts b/src/server.ts index bb25698c64..0c4670dbe8 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1005,17 +1005,24 @@ async function main(): Promise { // same WEBHOOKS lane the push receiver uses. if (process.env.ORB_RELAY_MODE === "pull" && process.env.ORB_ENROLLMENT_SECRET && relayDrainState) { const { drainOrbRelay } = await import("./orb/broker-client"); + let drainInFlight = false; const { enqueueWebhookByEnv } = await import("./github/webhook"); - /* v8 ignore start -- pull-mode relay loop is a live self-host timer; monitor semantics are covered in selfhost tests. */ - const drainRelay = async (): Promise => { - await drainOrbRelayWithMonitor({ - state: relayDrainState, - relayEnv: { - ORB_ENROLLMENT_SECRET: process.env.ORB_ENROLLMENT_SECRET, - ORB_BROKER_URL: process.env.ORB_BROKER_URL, - }, - env, - drain: drainOrbRelay, + if (drainInFlight) return; + drainInFlight = true; + try { + await drainOrbRelayWithMonitor({ + state: relayDrainState, + relayEnv: { + ORB_ENROLLMENT_SECRET: process.env.ORB_ENROLLMENT_SECRET, + ORB_BROKER_URL: process.env.ORB_BROKER_URL, + }, + env, + drain: drainOrbRelay, + enqueue: enqueueWebhookByEnv, + }); + } finally { + drainInFlight = false; + } enqueue: enqueueWebhookByEnv, }); }; @@ -1023,7 +1030,7 @@ async function main(): Promise { setInterval( () => void drainRelay().catch((error) => - captureError(error, { kind: "orb_relay_drain" }), + 30_000, ), 15_000, );