diff --git a/server/src/index.ts b/server/src/index.ts index 7ceed95cb9f..63e1e5d6809 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -1786,12 +1786,6 @@ async function startServerWithDatabaseTeardown( if (config.heartbeatSchedulerEnabled) await heartbeat.registerStoppedInstructionCollectionWork(deliveryWork, () => !isIdleTaskDrainActive() && !heartbeatSchedulerStopped && !isWarmStandby()).ready; - // Startup housekeeping: provider and connection sweeps that every timer tick - // repeats and that neither serving requests nor run recovery depends on. - // Readiness does not wait for it. It is tracked as scheduler work, so idle - // sleep and shutdown wait for it. Each step logs its own failure and the - // next step still runs. The scheduler interval starts after it, so the login - // reapers and the lease cleanup still finish before the first timer tick. const runStartupHousekeeping = async () => { const step = (name: string, work: () => Promise) => work().catch((err: unknown) => { diff --git a/server/src/services/decision-target-work.ts b/server/src/services/decision-target-work.ts index 0a285fa86ec..b26e658a3b3 100644 --- a/server/src/services/decision-target-work.ts +++ b/server/src/services/decision-target-work.ts @@ -7,12 +7,13 @@ export function registerDecisionTargetWork( service: Pick, "sweepInvalidTargets" | "decisionTargetsChanged" | "hasDecisionTargetWork">, canRun: () => boolean, ) { + const retryMs = 30_000; return coordinator.register(DELIVERY_QUEUES.decisionTargets, { - retryMs: 30_000, + retryMs, pausePassiveMaintenance: true, onSettled: service.decisionTargetsChanged, run: signal => canRun() ? service.sweepInvalidTargets(new Date(), signal) : Promise.resolve(), hasPending: async () => canRun() && service.hasDecisionTargetWork(), - nextRunAt: () => service.hasDecisionTargetWork() ? Date.now() + 30_000 : null, + nextRunAt: () => service.hasDecisionTargetWork() ? Date.now() + retryMs : null, }); }