From 43327439445436824492ff32adf0e280db89223d Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Sat, 21 Feb 2026 11:28:26 +0000 Subject: [PATCH] feat(supervisor): add flag to enable compute snapshots Gates snapshot/restore behaviour independently of compute mode. When disabled, VMs won't receive the metadata URL and suspend/restore are no-ops. Defaults to off so compute mode can be used without snapshots. --- apps/supervisor/src/env.ts | 1 + apps/supervisor/src/index.ts | 2 +- apps/supervisor/src/workloadManager/compute.ts | 18 +++++++++++------- apps/supervisor/src/workloadServer/index.ts | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/supervisor/src/env.ts b/apps/supervisor/src/env.ts index a8750221a..3cf695138 100644 --- a/apps/supervisor/src/env.ts +++ b/apps/supervisor/src/env.ts @@ -81,6 +81,7 @@ const Env = z.object({ COMPUTE_GATEWAY_URL: z.string().url().optional(), COMPUTE_GATEWAY_AUTH_TOKEN: z.string().optional(), COMPUTE_GATEWAY_TIMEOUT_MS: z.coerce.number().int().default(30_000), + COMPUTE_SNAPSHOTS_ENABLED: BoolEnv.default(false), // Kubernetes settings KUBERNETES_FORCE_ENABLED: BoolEnv.default(false), diff --git a/apps/supervisor/src/index.ts b/apps/supervisor/src/index.ts index 5ba2bbf7e..dd91591ab 100644 --- a/apps/supervisor/src/index.ts +++ b/apps/supervisor/src/index.ts @@ -223,7 +223,7 @@ class ManagedSupervisor { if (checkpoint) { this.logger.log("Restoring run", { runId: message.run.id }); - if (this.isComputeMode && this.computeManager) { + if (this.isComputeMode && this.computeManager && env.COMPUTE_SNAPSHOTS_ENABLED) { try { // Derive runnerId unique per restore cycle (matches iceman's pattern) const runIdShort = message.run.friendlyId.replace("run_", ""); diff --git a/apps/supervisor/src/workloadManager/compute.ts b/apps/supervisor/src/workloadManager/compute.ts index 1d9e905ce..ea7be55d1 100644 --- a/apps/supervisor/src/workloadManager/compute.ts +++ b/apps/supervisor/src/workloadManager/compute.ts @@ -51,7 +51,7 @@ export class ComputeWorkloadManager implements WorkloadManager { envVars.TRIGGER_WARM_START_URL = this.opts.warmStartUrl; } - if (this.opts.metadataUrl) { + if (env.COMPUTE_SNAPSHOTS_ENABLED && this.opts.metadataUrl) { envVars.TRIGGER_METADATA_URL = this.opts.metadataUrl; } @@ -266,17 +266,21 @@ export class ComputeWorkloadManager implements WorkloadManager { TRIGGER_WORKER_INSTANCE_NAME: env.TRIGGER_WORKER_INSTANCE_NAME, }; + const body = { + name: opts.runnerId, + metadata, + cpu: opts.machine.cpu, + memory_mb: opts.machine.memory * 1024, + }; + + this.logger.debug("restore request body", { url, body }); + const [error, response] = await tryCatch( fetch(url, { method: "POST", headers: this.authHeaders, signal: AbortSignal.timeout(this.opts.gatewayTimeoutMs), - body: JSON.stringify({ - name: opts.runnerId, - metadata, - cpu: opts.machine.cpu, - memory_mb: opts.machine.memory * 1024, - }), + body: JSON.stringify(body), }) ); diff --git a/apps/supervisor/src/workloadServer/index.ts b/apps/supervisor/src/workloadServer/index.ts index 6598da76a..0586c259a 100644 --- a/apps/supervisor/src/workloadServer/index.ts +++ b/apps/supervisor/src/workloadServer/index.ts @@ -263,7 +263,7 @@ export class WorkloadServer extends EventEmitter { return; } - if (this.computeManager) { + if (this.computeManager && env.COMPUTE_SNAPSHOTS_ENABLED) { // Compute mode: fire-and-forget snapshot with callback reply.json({ ok: true } satisfies WorkloadSuspendRunResponseBody, false, 202);