@shipfox/api-runners 12.6.0 → 12.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -4
- package/CHANGELOG.md +8 -0
- package/dist/db/job-executions.d.ts +3 -0
- package/dist/db/job-executions.d.ts.map +1 -1
- package/dist/db/job-executions.js +23 -1
- package/dist/db/job-executions.js.map +1 -1
- package/dist/db/provisioner-tokens.d.ts.map +1 -1
- package/dist/db/provisioner-tokens.js +14 -2
- package/dist/db/provisioner-tokens.js.map +1 -1
- package/dist/db/reservations.d.ts +10 -0
- package/dist/db/reservations.d.ts.map +1 -1
- package/dist/db/reservations.js +137 -17
- package/dist/db/reservations.js.map +1 -1
- package/dist/db/runner-assignments.d.ts.map +1 -1
- package/dist/db/runner-assignments.js +8 -5
- package/dist/db/runner-assignments.js.map +1 -1
- package/dist/db/runner-instances.d.ts +0 -1
- package/dist/db/runner-instances.d.ts.map +1 -1
- package/dist/db/runner-instances.js +85 -100
- package/dist/db/runner-instances.js.map +1 -1
- package/dist/db/runner-states.d.ts +3 -1
- package/dist/db/runner-states.d.ts.map +1 -1
- package/dist/db/runner-states.js +6 -4
- package/dist/db/runner-states.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/db/job-executions.test.ts +119 -0
- package/src/db/job-executions.ts +24 -2
- package/src/db/provisioner-tokens.test.ts +19 -0
- package/src/db/provisioner-tokens.ts +13 -2
- package/src/db/reservations.test.ts +138 -0
- package/src/db/reservations.ts +311 -35
- package/src/db/runner-assignments.test.ts +20 -0
- package/src/db/runner-assignments.ts +6 -7
- package/src/db/runner-instances.test.ts +250 -15
- package/src/db/runner-instances.ts +136 -198
- package/src/db/runner-states.test.ts +16 -0
- package/src/db/runner-states.ts +9 -4
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/runner-instances.ts"],"sourcesContent":["import {logger} from '@shipfox/node-opentelemetry';\nimport {\n and,\n asc,\n desc,\n eq,\n exists,\n gt,\n inArray,\n isNotNull,\n isNull,\n lt,\n notExists,\n notInArray,\n or,\n type SQL,\n sql,\n} from 'drizzle-orm';\nimport {alias} from 'drizzle-orm/pg-core';\nimport {config} from '#config.js';\nimport type {RunnerInstance, RunnerInstanceState} from '#core/entities/runner-instance.js';\nimport {sanitizeRunnerLabels} from '#core/runner-labels.js';\nimport {recordRunnerReservationCapacityFailure} from '#metrics/index.js';\nimport type {Tx} from './db.js';\nimport {db} from './db.js';\nimport {\n listRunningJobExecutionsByRunnerInstanceTx,\n type RunnerInstanceBoundJobExecution,\n} from './job-executions.js';\nimport {lockRunnerReservationAdvisoryKeysTx} from './reservation-locks.js';\nimport {releaseReservationUnits} from './reservations.js';\nimport {validateRunnerReservationCapacityTx} from './runner-assignments.js';\nimport {terminalStates} from './runner-states.js';\nimport {ephemeralRegistrationTokens} from './schema/ephemeral-registration-tokens.js';\nimport {provisionerTokens} from './schema/provisioner-tokens.js';\nimport {reservations} from './schema/reservations.js';\nimport {runnerControlSessions} from './schema/runner-control-sessions.js';\nimport {providerRunners, toRunnerInstance} from './schema/runner-instances.js';\nimport {runnerSessions} from './schema/runner-sessions.js';\nimport {runningJobExecutions} from './schema/running-job-executions.js';\n\nexport const activeStates = [\n 'starting',\n 'running',\n 'stopping',\n] as const satisfies readonly RunnerInstanceState[];\nexport const divergenceCountStates = ['starting', 'running'] as const satisfies readonly Extract<\n RunnerInstanceState,\n 'starting' | 'running'\n>[];\n\nexport type RunnerInstanceTerminateIntentReason = 'activation-timeout' | 'job-cancelled';\n\nexport interface RunnerInstanceTerminateIntent {\n providerRunnerId: string;\n reason: RunnerInstanceTerminateIntentReason;\n activationTimeoutRetry?: boolean;\n}\n\nexport interface ActiveRunnerInstanceTemplateCount {\n templateKey: string;\n state: (typeof divergenceCountStates)[number];\n count: number;\n}\n\nexport interface RunnerInstanceReportEvent {\n providerRunnerId: string;\n reservationId: string | null;\n templateKey: string | null;\n labels: string[];\n state: RunnerInstanceState;\n reason: string | null;\n runnerSessionId: string | null;\n providerKind: string | null;\n reportedAt: Date;\n}\n\nexport interface ReportRunnerInstancesParams {\n scope: 'installation' | 'workspace';\n workspaceId: string | null;\n provisionerId: string;\n events: RunnerInstanceReportEvent[];\n}\n\nexport interface ReconcileRunnerInstancesParams {\n workspaceId: string | null;\n provisionerId: string;\n observedRunnerInstanceIds: string[];\n terminateGraceSeconds: number;\n}\n\nexport interface ReconcileRunnerInstancesDbResult {\n observedRows: RunnerInstance[];\n boundJobExecutionsByRunnerInstanceId: Map<string, RunnerInstanceBoundJobExecution>;\n absentIds: string[];\n reservationsReleased: number;\n}\n\nexport interface ReapStaleRunnerInstancesResult {\n reaped: number;\n reservationsReleased: number;\n}\n\nexport async function attachRunnerInstanceProviderId(params: {\n runnerInstanceId: string;\n provisionerId: string;\n providerRunnerId: string;\n}): Promise<boolean> {\n const updated = await db()\n .update(providerRunners)\n .set({providerRunnerId: params.providerRunnerId, updatedAt: sql`now()`})\n .where(\n and(\n eq(providerRunners.id, params.runnerInstanceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n isNull(providerRunners.providerRunnerId),\n notInArray(providerRunners.state, [...terminalStates]),\n ),\n )\n .returning({id: providerRunners.id});\n return updated.length === 1;\n}\n\ninterface RunnerInstanceReportRow extends RunnerInstanceReportEvent {\n startedAt: Date | null;\n stoppingAt: Date | null;\n stoppedAt: Date | null;\n failedAt: Date | null;\n terminatedAt: Date | null;\n}\n\ntype RunnerInstanceMilestoneColumn =\n | typeof providerRunners.startedAt\n | typeof providerRunners.stoppingAt\n | typeof providerRunners.stoppedAt\n | typeof providerRunners.failedAt\n | typeof providerRunners.terminatedAt;\n\nexport async function reportRunnerInstances(params: ReportRunnerInstancesParams): Promise<{\n accepted: number;\n reservationsReleased: number;\n terminateIntentsHonored: RunnerInstanceTerminateIntent[];\n}> {\n if (params.events.length === 0)\n return {accepted: 0, reservationsReleased: 0, terminateIntentsHonored: []};\n\n return await db().transaction(async (tx) => {\n const receivedAt = new Date();\n const aggregatedEvents = aggregateEvents(params.events, receivedAt);\n const hasTerminalEvent = aggregatedEvents.some((event) => isTerminalState(event.state));\n\n if (hasTerminalEvent) {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId ?? params.provisionerId}))`,\n );\n }\n\n const events = await hydrateRunnerSessionIdsFromConsumedTokens(tx, params, aggregatedEvents);\n const reservationSafeEvents = await guardReportedReservationIdsTx(tx, params, events);\n const terminateIntentsHonored = await listTerminateIntentsHonoredByTerminatedReportsTx(\n tx,\n params,\n reservationSafeEvents,\n );\n\n const values = reservationSafeEvents.map((event) => ({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerId: event.providerRunnerId,\n reservationId: event.reservationId,\n templateKey: event.templateKey,\n labels: sanitizeRunnerLabels(event.labels, {\n scope: params.scope,\n logLevel: 'debug',\n source: 'runner instance report',\n }),\n state: event.state,\n reason: event.reason,\n runnerSessionId: event.runnerSessionId,\n providerKind: event.providerKind,\n reportedAt: event.reportedAt > receivedAt ? receivedAt : event.reportedAt,\n startedAt: event.startedAt,\n stoppingAt: event.stoppingAt,\n stoppedAt: event.stoppedAt,\n failedAt: event.failedAt,\n terminatedAt: event.terminatedAt,\n }));\n\n await tx\n .insert(providerRunners)\n .values(values)\n .onConflictDoUpdate({\n target: [providerRunners.provisionerId, providerRunners.providerRunnerId],\n targetWhere: isNotNull(providerRunners.providerRunnerId),\n set: {\n reservationId: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN coalesce(${providerRunners.reservationId}, excluded.reservation_id) ELSE ${providerRunners.reservationId} END`,\n templateKey: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN coalesce(excluded.template_key, ${providerRunners.templateKey}) ELSE ${providerRunners.templateKey} END`,\n labels: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN excluded.labels ELSE ${providerRunners.labels} END`,\n state: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN excluded.state ELSE ${providerRunners.state} END`,\n reason: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN excluded.reason ELSE ${providerRunners.reason} END`,\n runnerSessionId: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN coalesce(${providerRunners.runnerSessionId}, excluded.runner_session_id) ELSE ${providerRunners.runnerSessionId} END`,\n providerKind: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN coalesce(excluded.provider_kind, ${providerRunners.providerKind}) ELSE ${providerRunners.providerKind} END`,\n reportedAt: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN excluded.reported_at ELSE ${providerRunners.reportedAt} END`,\n startedAt: firstObservedAt(providerRunners.startedAt, sql`excluded.started_at`),\n stoppingAt: firstObservedAt(providerRunners.stoppingAt, sql`excluded.stopping_at`),\n stoppedAt: firstObservedAt(providerRunners.stoppedAt, sql`excluded.stopped_at`),\n failedAt: firstObservedAt(providerRunners.failedAt, sql`excluded.failed_at`),\n terminatedAt: firstObservedAt(providerRunners.terminatedAt, sql`excluded.terminated_at`),\n updatedAt: sql`now()`,\n },\n setWhere: sql`\n ${providerRunnerProjectionUpdateCondition()}\n OR ${providerRunnerMilestoneUpdateCondition()}\n `,\n });\n\n const reservationsReleased = hasTerminalEvent\n ? await releaseTerminalRunnerInstanceReservations(tx, params, reservationSafeEvents)\n : 0;\n\n return {\n accepted: reservationSafeEvents.length,\n reservationsReleased,\n terminateIntentsHonored,\n };\n });\n}\n\nasync function guardReportedReservationIdsTx(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportRow[],\n): Promise<RunnerInstanceReportRow[]> {\n const reservationIds = [\n ...new Set(events.flatMap((event) => (event.reservationId ? [event.reservationId] : []))),\n ].sort();\n if (reservationIds.length === 0) return events;\n\n await lockRunnerReservationAdvisoryKeysTx(tx, {\n provisionerId: params.provisionerId,\n reservationIds,\n });\n const providerRunnerIds = events.map((event) => event.providerRunnerId);\n const existingRows = await tx\n .select({\n providerRunnerId: providerRunners.providerRunnerId,\n reservationId: providerRunners.reservationId,\n intendedReservationId: providerRunners.intendedReservationId,\n reservationReleasedAt: providerRunners.reservationReleasedAt,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, providerRunnerIds),\n ),\n )\n .for('update');\n const existingByProviderRunnerId = new Map(\n existingRows.flatMap((row) =>\n row.providerRunnerId ? [[row.providerRunnerId, row] as const] : [],\n ),\n );\n const candidateReservationByProviderRunnerId = new Map<string, string>();\n for (const event of events) {\n if (!event.reservationId) continue;\n if (isTerminalState(event.state)) continue;\n const existing = existingByProviderRunnerId.get(event.providerRunnerId);\n if (existing?.reservationId || existing?.intendedReservationId === event.reservationId)\n continue;\n if (existing?.intendedReservationId || existing?.reservationReleasedAt) continue;\n candidateReservationByProviderRunnerId.set(event.providerRunnerId, event.reservationId);\n }\n\n const validation = await validateRunnerReservationCapacityTx(\n tx,\n {\n provisionerId: params.provisionerId,\n requests: [...candidateReservationByProviderRunnerId.values()].map((reservationId) => ({\n reservationId,\n count: 1,\n })),\n },\n {advisoryLocksHeld: true},\n );\n for (const {reason, count} of validation.unavailableByReservation.values())\n recordRunnerReservationCapacityFailure(reason, count);\n\n const remainingAcceptedByReservation = new Map(validation.acceptedByReservation);\n return events.map((event) => {\n const existing = existingByProviderRunnerId.get(event.providerRunnerId);\n const reservationId = candidateReservationByProviderRunnerId.get(event.providerRunnerId);\n if (!reservationId) {\n if (event.reservationId && isTerminalState(event.state)) {\n // Terminal cleanup releases the IDs stored on the projection row. An arbitrary\n // terminal report must not consume reservation capacity during that cleanup.\n const matchesExistingReservation =\n existing !== undefined &&\n (existing.reservationId === event.reservationId ||\n existing.intendedReservationId === event.reservationId);\n if (!matchesExistingReservation) return {...event, reservationId: null};\n }\n if (\n event.reservationId &&\n existing?.intendedReservationId &&\n existing.intendedReservationId !== event.reservationId\n )\n return {...event, reservationId: null};\n if (event.reservationId && existing?.reservationReleasedAt)\n return {...event, reservationId: null};\n return event;\n }\n const remaining = remainingAcceptedByReservation.get(reservationId) ?? 0;\n if (remaining === 0) return {...event, reservationId: null};\n remainingAcceptedByReservation.set(reservationId, remaining - 1);\n return event;\n });\n}\n\nexport async function listActiveRunnerInstanceCountsByTemplateTx(\n tx: Tx,\n params: {workspaceId: string; provisionerId: string},\n): Promise<ActiveRunnerInstanceTemplateCount[]> {\n const rows = await tx\n .select({\n templateKey: providerRunners.templateKey,\n state: providerRunners.state,\n count: sql<number>`count(*)::int`,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.state, divergenceCountStates),\n isNotNull(providerRunners.templateKey),\n ),\n )\n .groupBy(providerRunners.templateKey, providerRunners.state);\n\n return rows.flatMap((row) =>\n row.templateKey && isDivergenceCountState(row.state)\n ? [{templateKey: row.templateKey, state: row.state, count: row.count}]\n : [],\n );\n}\n\nexport async function countStaleEnrolledRunnerInstances(params: {\n graceSeconds: number;\n}): Promise<number> {\n const [row] = await db()\n .select({count: sql<number>`count(*)::int`})\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.state, 'running'),\n isNull(providerRunners.workspaceId),\n isNull(providerRunners.runnerSessionId),\n lt(providerRunners.reportedAt, staleRunnerInstanceCutoff(params.graceSeconds)),\n exists(\n db()\n .select({id: runnerControlSessions.id})\n .from(runnerControlSessions)\n .where(\n and(\n eq(runnerControlSessions.runnerInstanceId, providerRunners.id),\n isNull(runnerControlSessions.closedAt),\n gt(runnerControlSessions.expiresAt, sql`now()`),\n ),\n ),\n ),\n ),\n );\n\n return row?.count ?? 0;\n}\n\nexport type ProviderRunnerPhase =\n | 'control_session'\n | 'enrollment'\n | 'assignment'\n | 'activation'\n | 'idle';\n\nexport interface ProviderRunnerPhaseMetric {\n phase: ProviderRunnerPhase;\n provider: string;\n launchKind: 'demand' | 'warm' | 'manual';\n count: number;\n oldestAgeMilliseconds: number;\n}\n\nexport async function listProviderRunnerByPhaseMetrics(): Promise<ProviderRunnerPhaseMetric[]> {\n const phase = sql<ProviderRunnerPhase>`case\n when ${runnerControlSessions.id} is null then 'control_session'\n when ${providerRunners.state} <> 'running' then 'enrollment'\n when ${providerRunners.intendedReservationId} is not null\n and ${providerRunners.workspaceId} is null then 'assignment'\n when ${providerRunners.workspaceId} is not null then 'activation'\n else 'idle'\n end`;\n const startedAt = sql<Date | null>`case\n when ${runnerControlSessions.id} is null then ${providerRunners.createdAt}\n when ${providerRunners.state} <> 'running' then ${runnerControlSessions.createdAt}\n when ${providerRunners.intendedReservationId} is not null\n and ${providerRunners.workspaceId} is null then ${runnerControlSessions.createdAt}\n when ${providerRunners.workspaceId} is not null\n then coalesce(${providerRunners.assignedAt}, ${runnerControlSessions.createdAt})\n else coalesce(\n ${runnerControlSessions.createdAt},\n ${providerRunners.assignedAt},\n ${providerRunners.createdAt}\n )\n end`;\n const rows = await db()\n .select({\n phase,\n provider: sql<string>`coalesce(${providerRunners.providerKind}, 'unknown')`,\n launchKind: providerRunners.launchKind,\n count: sql<number>`count(*)::int`,\n oldestAgeMilliseconds: sql<number>`coalesce(\n max(extract(epoch from (now() - (${startedAt}))) * 1000),\n 0\n )::double precision`,\n })\n .from(providerRunners)\n .leftJoin(\n runnerControlSessions,\n and(\n eq(runnerControlSessions.runnerInstanceId, providerRunners.id),\n isNull(runnerControlSessions.closedAt),\n gt(runnerControlSessions.expiresAt, sql`now()`),\n ),\n )\n .where(\n and(\n inArray(providerRunners.state, ['starting', 'running']),\n isNull(providerRunners.runnerSessionId),\n ),\n )\n .groupBy(phase, providerRunners.providerKind, providerRunners.launchKind);\n\n return rows.map((row) => ({\n phase: row.phase,\n provider: row.provider,\n launchKind: row.launchKind,\n count: row.count,\n oldestAgeMilliseconds: Math.max(0, row.oldestAgeMilliseconds),\n }));\n}\n\nexport async function listActiveRunnerInstances(params: {\n workspaceId: string;\n windowSeconds: number;\n limit?: number;\n}): Promise<RunnerInstance[]> {\n const rows = await db()\n .select()\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n inArray(providerRunners.state, activeStates),\n sql`${providerRunners.updatedAt} > now() - (${params.windowSeconds} || ' seconds')::interval`,\n ),\n )\n .orderBy(desc(providerRunners.updatedAt), desc(providerRunners.id))\n .limit(params.limit ?? 1000);\n\n return rows.map(toRunnerInstance);\n}\n\nexport async function listProvisionerTerminateIntents(params: {\n workspaceId: string;\n provisionerId: string;\n limit: number;\n}): Promise<string[]> {\n return await db().transaction(async (tx) => {\n const rows = await listProvisionerTerminateIntentRowsTx(tx, params);\n return rows.map((row) => row.providerRunnerId);\n });\n}\n\nexport async function listProvisionerTerminateIntentRowsTx(\n tx: Tx,\n params: {\n workspaceId: string;\n provisionerId: string;\n limit: number;\n },\n): Promise<RunnerInstanceTerminateIntent[]> {\n const rows = await provisionerTerminateIntentsQuery(tx, params)\n .orderBy(asc(providerRunners.providerRunnerId))\n .limit(params.limit + 1);\n\n const truncated = rows.length > params.limit;\n const returnedRows = truncated ? rows.slice(0, params.limit) : rows;\n if (truncated) {\n logger().warn(\n {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n limit: params.limit,\n returnedCount: returnedRows.length,\n },\n 'provisioner terminate intents truncated by poll-demand limit',\n );\n }\n\n const activationTimeoutRunnerIds = returnedRows.flatMap((row) =>\n row.reason === 'activation-timeout' && row.providerRunnerId ? [row.providerRunnerId] : [],\n );\n if (activationTimeoutRunnerIds.length > 0) {\n await tx\n .update(providerRunners)\n .set({reservationReleasedAt: sql`now()`, updatedAt: sql`now()`})\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, activationTimeoutRunnerIds),\n isNull(providerRunners.reservationReleasedAt),\n ),\n );\n }\n\n return returnedRows.flatMap((row) => toRunnerInstanceTerminateIntent(row));\n}\n\nfunction toRunnerInstanceTerminateIntent(row: {\n providerRunnerId: string | null;\n reason: RunnerInstanceTerminateIntentReason;\n activationTimeoutRetry: boolean;\n}): RunnerInstanceTerminateIntent[] {\n if (!row.providerRunnerId) return [];\n\n return [\n {\n providerRunnerId: row.providerRunnerId,\n reason: row.reason,\n ...(row.reason === 'activation-timeout' && row.activationTimeoutRetry\n ? {activationTimeoutRetry: true}\n : {}),\n },\n ];\n}\n\nfunction provisionerTerminateIntentsQuery(\n tx: Tx,\n params: {workspaceId: string; provisionerId: string; providerRunnerIds?: string[]},\n) {\n const newerRunningJobExecutions = alias(runningJobExecutions, 'newer_running_jobs');\n const latestCancelledJob = exists(\n tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, params.workspaceId),\n eq(runningJobExecutions.provisionerId, params.provisionerId),\n eq(runningJobExecutions.providerRunnerId, providerRunners.providerRunnerId),\n isNotNull(runningJobExecutions.cancellationRequestedAt),\n notExists(\n tx\n .select({id: newerRunningJobExecutions.id})\n .from(newerRunningJobExecutions)\n .where(\n and(\n eq(newerRunningJobExecutions.workspaceId, runningJobExecutions.workspaceId),\n eq(newerRunningJobExecutions.provisionerId, runningJobExecutions.provisionerId),\n eq(\n newerRunningJobExecutions.providerRunnerId,\n runningJobExecutions.providerRunnerId,\n ),\n or(\n gt(newerRunningJobExecutions.startedAt, runningJobExecutions.startedAt),\n and(\n eq(newerRunningJobExecutions.startedAt, runningJobExecutions.startedAt),\n gt(\n newerRunningJobExecutions.jobExecutionId,\n runningJobExecutions.jobExecutionId,\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n );\n const activationTimeout = and(\n eq(providerRunners.launchKind, 'demand'),\n isNull(providerRunners.runnerSessionId),\n lt(\n providerRunners.createdAt,\n sql`now() - (${config.RUNNER_DEMAND_ACTIVATION_TIMEOUT_SECONDS} || ' seconds')::interval`,\n ),\n notExists(\n tx\n .select({id: reservations.id})\n .from(reservations)\n .where(\n and(\n or(\n eq(reservations.id, providerRunners.reservationId),\n eq(reservations.id, providerRunners.intendedReservationId),\n ),\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n gt(reservations.expiresAt, sql`now()`),\n ),\n ),\n ),\n );\n\n return tx\n .select({\n providerRunnerId: providerRunners.providerRunnerId,\n activationTimeoutRetry: sql<boolean>`${providerRunners.reservationReleasedAt} is not null`,\n reason: sql<RunnerInstanceTerminateIntentReason>`case\n when ${activationTimeout} then 'activation-timeout'\n else 'job-cancelled'\n end`,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n isNotNull(providerRunners.providerRunnerId),\n inArray(providerRunners.state, activeStates),\n params.providerRunnerIds && params.providerRunnerIds.length > 0\n ? inArray(providerRunners.providerRunnerId, params.providerRunnerIds)\n : undefined,\n or(latestCancelledJob, activationTimeout),\n ),\n );\n}\n\nasync function listTerminateIntentsHonoredByTerminatedReportsTx(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportEvent[],\n): Promise<RunnerInstanceTerminateIntent[]> {\n if (!params.workspaceId) return [];\n const terminatedRunnerInstanceIds = [\n ...new Set(\n events.filter((event) => event.state === 'terminated').map((event) => event.providerRunnerId),\n ),\n ];\n if (terminatedRunnerInstanceIds.length === 0) return [];\n\n const rows = await provisionerTerminateIntentsQuery(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: terminatedRunnerInstanceIds,\n }).orderBy(asc(providerRunners.providerRunnerId));\n return rows.flatMap((row) => toRunnerInstanceTerminateIntent(row));\n}\n\nexport async function reconcileRunnerInstances(\n params: ReconcileRunnerInstancesParams,\n): Promise<ReconcileRunnerInstancesDbResult> {\n const observedRunnerInstanceIds = [...new Set(params.observedRunnerInstanceIds)];\n\n return await db().transaction(async (tx) => {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId ?? params.provisionerId}))`,\n );\n\n let absentIds: string[] = [];\n let reservationsReleased = 0;\n if (observedRunnerInstanceIds.length > 0) {\n const staleAbsentRows = await tx\n .select({\n id: providerRunners.id,\n providerRunnerId: providerRunners.providerRunnerId,\n })\n .from(providerRunners)\n .where(\n and(\n params.workspaceId\n ? eq(providerRunners.workspaceId, params.workspaceId)\n : isNull(providerRunners.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.state, activeStates),\n lt(\n providerRunners.reportedAt,\n sql`now() - (${params.terminateGraceSeconds} || ' seconds')::interval`,\n ),\n notInArray(providerRunners.providerRunnerId, observedRunnerInstanceIds),\n ),\n );\n\n if (staleAbsentRows.length > 0) {\n const updated = await tx\n .update(providerRunners)\n .set({\n state: 'terminated',\n terminatedAt: sql`coalesce(${providerRunners.terminatedAt}, now())`,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n inArray(\n providerRunners.id,\n staleAbsentRows.map((row) => row.id),\n ),\n inArray(providerRunners.state, activeStates),\n lt(\n providerRunners.reportedAt,\n sql`now() - (${params.terminateGraceSeconds} || ' seconds')::interval`,\n ),\n ),\n )\n .returning({providerRunnerId: providerRunners.providerRunnerId});\n\n absentIds = updated.flatMap((row) => (row.providerRunnerId ? [row.providerRunnerId] : []));\n if (params.workspaceId) {\n reservationsReleased = await releaseTerminalRunnerInstanceReservationsByIds(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: absentIds,\n });\n }\n }\n }\n\n const observedRows =\n observedRunnerInstanceIds.length === 0\n ? []\n : (\n await tx\n .select()\n .from(providerRunners)\n .where(\n and(\n params.workspaceId\n ? eq(providerRunners.workspaceId, params.workspaceId)\n : isNull(providerRunners.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, observedRunnerInstanceIds),\n ),\n )\n ).map(toRunnerInstance);\n\n const boundJobExecutions = params.workspaceId\n ? await listRunningJobExecutionsByRunnerInstanceTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: observedRunnerInstanceIds,\n })\n : [];\n\n return {\n observedRows,\n boundJobExecutionsByRunnerInstanceId: new Map(\n boundJobExecutions.map((jobExecution) => [jobExecution.providerRunnerId, jobExecution]),\n ),\n absentIds,\n reservationsReleased,\n };\n });\n}\n\nexport async function reapStaleRunnerInstances(params: {\n thresholdSeconds: number;\n limit: number;\n}): Promise<ReapStaleRunnerInstancesResult> {\n const cutoff = staleRunnerInstanceCutoff(params.thresholdSeconds);\n\n return await db().transaction(async (tx) => {\n const candidateRows = await tx\n .select({\n id: providerRunners.id,\n workspaceId: providerRunners.workspaceId,\n provisionerId: providerRunners.provisionerId,\n providerRunnerId: providerRunners.providerRunnerId,\n })\n .from(providerRunners)\n .where(staleRunnerInstanceWhere(tx, cutoff))\n .orderBy(asc(providerRunners.updatedAt), asc(providerRunners.id))\n .limit(params.limit);\n\n if (candidateRows.length === 0) return {reaped: 0, reservationsReleased: 0};\n\n const workspaceIds = [\n ...new Set(candidateRows.flatMap((row) => (row.workspaceId ? [row.workspaceId] : []))),\n ].sort();\n for (const workspaceId of workspaceIds) {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${workspaceId}))`);\n }\n\n const updatedRows = await tx\n .update(providerRunners)\n .set({\n state: 'failed',\n reason: 'stale-provisioner',\n failedAt: sql`coalesce(${providerRunners.failedAt}, now())`,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n inArray(\n providerRunners.id,\n candidateRows.map((row) => row.id),\n ),\n staleRunnerInstanceWhere(tx, cutoff),\n ),\n )\n .returning({\n workspaceId: providerRunners.workspaceId,\n provisionerId: providerRunners.provisionerId,\n providerRunnerId: providerRunners.providerRunnerId,\n });\n\n let reservationsReleased = 0;\n for (const group of groupRunnerInstanceIds(updatedRows)) {\n reservationsReleased += await releaseTerminalRunnerInstanceReservationsByIds(tx, {\n workspaceId: group.workspaceId,\n provisionerId: group.provisionerId,\n providerRunnerIds: group.providerRunnerIds,\n requireUnlinkedSession: false,\n });\n }\n\n return {reaped: updatedRows.length, reservationsReleased};\n });\n}\n\nasync function releaseTerminalRunnerInstanceReservations(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportEvent[],\n): Promise<number> {\n const terminalEvents = events.filter((event) => isTerminalState(event.state));\n if (terminalEvents.length === 0) return 0;\n\n return await releaseTerminalRunnerInstanceReservationsByIds(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: terminalEvents.map((event) => event.providerRunnerId),\n });\n}\n\nasync function releaseTerminalRunnerInstanceReservationsByIds(\n tx: Tx,\n params: {\n workspaceId: string | null;\n provisionerId: string;\n providerRunnerIds: string[];\n requireUnlinkedSession?: boolean;\n },\n): Promise<number> {\n if (params.providerRunnerIds.length === 0) return 0;\n\n const reservationWorkspacePredicate =\n params.workspaceId === null\n ? sql``\n : sql`and ${eq(reservations.workspaceId, params.workspaceId)}`;\n\n const rows = await tx\n .select({\n id: providerRunners.id,\n releaseReservationId: sql<string | null>`coalesce(\n (select ${reservations.id}\n from ${reservations}\n where ${reservations.id} = ${providerRunners.intendedReservationId}\n and ${reservations.provisionerId} = ${params.provisionerId}\n ${reservationWorkspacePredicate}),\n (select ${reservations.id}\n from ${reservations}\n where ${reservations.id} = ${providerRunners.reservationId}\n and ${reservations.provisionerId} = ${params.provisionerId}\n ${reservationWorkspacePredicate})\n )`,\n releaseReservationWorkspaceId: sql<string | null>`coalesce(\n (select ${reservations.workspaceId}\n from ${reservations}\n where ${reservations.id} = ${providerRunners.intendedReservationId}\n and ${reservations.provisionerId} = ${params.provisionerId}\n ${reservationWorkspacePredicate}),\n (select ${reservations.workspaceId}\n from ${reservations}\n where ${reservations.id} = ${providerRunners.reservationId}\n and ${reservations.provisionerId} = ${params.provisionerId}\n ${reservationWorkspacePredicate})\n )`,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, params.providerRunnerIds),\n inArray(providerRunners.state, terminalStates),\n or(\n isNotNull(providerRunners.reservationId),\n isNotNull(providerRunners.intendedReservationId),\n ),\n params.workspaceId === null\n ? undefined\n : or(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n or(\n exists(\n tx\n .select({id: reservations.id})\n .from(reservations)\n .where(\n and(\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n eq(reservations.id, providerRunners.reservationId),\n ),\n ),\n ),\n exists(\n tx\n .select({id: reservations.id})\n .from(reservations)\n .where(\n and(\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n eq(reservations.id, providerRunners.intendedReservationId),\n ),\n ),\n ),\n ),\n ),\n and(\n isNull(providerRunners.workspaceId),\n isNotNull(providerRunners.intendedReservationId),\n exists(\n tx\n .select({id: reservations.id})\n .from(reservations)\n .where(\n and(\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n eq(reservations.id, providerRunners.intendedReservationId),\n ),\n ),\n ),\n ),\n ),\n params.requireUnlinkedSession === false\n ? undefined\n : isNull(providerRunners.runnerSessionId),\n isNull(providerRunners.reservationReleasedAt),\n ),\n )\n .for('update');\n\n if (rows.length === 0) return 0;\n\n const updated = await tx\n .update(providerRunners)\n .set({\n intendedReservationId: null,\n reservationReleasedAt: sql`now()`,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n inArray(\n providerRunners.id,\n rows.map((row) => row.id),\n ),\n params.requireUnlinkedSession === false\n ? undefined\n : isNull(providerRunners.runnerSessionId),\n isNull(providerRunners.reservationReleasedAt),\n ),\n )\n .returning({id: providerRunners.id});\n\n const releasesByReservationId = new Map<\n string,\n {workspaceId: string; reservationId: string; count: number}\n >();\n const updatedIds = new Set(updated.map((row) => row.id));\n for (const row of rows) {\n if (!updatedIds.has(row.id)) continue;\n if (!row.releaseReservationId || !row.releaseReservationWorkspaceId) continue;\n const key = `${row.releaseReservationWorkspaceId}:${row.releaseReservationId}`;\n const release = releasesByReservationId.get(key) ?? {\n workspaceId: row.releaseReservationWorkspaceId,\n reservationId: row.releaseReservationId,\n count: 0,\n };\n release.count += 1;\n releasesByReservationId.set(key, release);\n }\n\n if (releasesByReservationId.size === 0) return 0;\n\n let released = 0;\n for (const release of releasesByReservationId.values()) {\n released += await releaseReservationUnits(tx, {\n workspaceId: release.workspaceId,\n provisionerId: params.provisionerId,\n releases: [{reservationId: release.reservationId, count: release.count}],\n });\n }\n return released;\n}\n\nfunction staleRunnerInstanceCutoff(thresholdSeconds: number): SQL {\n return sql`now() - (${thresholdSeconds} || ' seconds')::interval`;\n}\n\nfunction staleRunnerInstanceWhere(tx: Tx, cutoff: SQL): SQL<boolean> {\n return and(\n inArray(providerRunners.state, activeStates),\n lt(providerRunners.reportedAt, cutoff),\n lt(providerRunners.updatedAt, cutoff),\n exists(\n tx\n .select({id: provisionerTokens.id})\n .from(provisionerTokens)\n .where(\n and(\n eq(provisionerTokens.id, providerRunners.provisionerId),\n or(isNull(provisionerTokens.lastSeenAt), lt(provisionerTokens.lastSeenAt, cutoff)),\n ),\n ),\n ),\n notExists(\n tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, providerRunners.workspaceId),\n eq(runningJobExecutions.provisionerId, providerRunners.provisionerId),\n eq(runningJobExecutions.providerRunnerId, providerRunners.providerRunnerId),\n ),\n ),\n ),\n notExists(\n tx\n .select({id: runnerSessions.id})\n .from(runnerSessions)\n .where(\n and(\n eq(runnerSessions.workspaceId, providerRunners.workspaceId),\n eq(runnerSessions.provisionerId, providerRunners.provisionerId),\n eq(runnerSessions.providerRunnerId, providerRunners.providerRunnerId),\n sql`${runnerSessions.updatedAt} >= ${cutoff}`,\n ),\n ),\n ),\n ) as SQL<boolean>;\n}\n\nfunction groupRunnerInstanceIds(\n rows: Array<{\n workspaceId: string | null;\n provisionerId: string;\n providerRunnerId: string | null;\n }>,\n): Array<{workspaceId: string | null; provisionerId: string; providerRunnerIds: string[]}> {\n const groups = new Map<\n string,\n {workspaceId: string | null; provisionerId: string; providerRunnerIds: string[]}\n >();\n for (const row of rows) {\n if (!row.providerRunnerId) continue;\n const key = `${row.workspaceId ?? ''}:${row.provisionerId}`;\n const group = groups.get(key) ?? {\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n providerRunnerIds: [],\n };\n group.providerRunnerIds.push(row.providerRunnerId);\n groups.set(key, group);\n }\n return [...groups.values()];\n}\n\nasync function hydrateRunnerSessionIdsFromConsumedTokens(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportRow[],\n): Promise<RunnerInstanceReportRow[]> {\n if (!params.workspaceId) return events;\n const providerRunnerIds = [...new Set(events.map((event) => event.providerRunnerId))];\n if (providerRunnerIds.length === 0) return events;\n\n const tokenRows = await tx\n .select({\n providerRunnerId: ephemeralRegistrationTokens.providerRunnerId,\n consumedSessionId: ephemeralRegistrationTokens.consumedSessionId,\n })\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n inArray(ephemeralRegistrationTokens.providerRunnerId, providerRunnerIds),\n isNotNull(ephemeralRegistrationTokens.consumedSessionId),\n ),\n )\n .orderBy(\n desc(ephemeralRegistrationTokens.consumedAt),\n desc(ephemeralRegistrationTokens.createdAt),\n );\n\n const consumedSessionIdsByRunnerInstanceId = new Map<string, string>();\n for (const row of tokenRows) {\n if (!row.consumedSessionId) continue;\n if (consumedSessionIdsByRunnerInstanceId.has(row.providerRunnerId)) continue;\n consumedSessionIdsByRunnerInstanceId.set(row.providerRunnerId, row.consumedSessionId);\n }\n\n if (consumedSessionIdsByRunnerInstanceId.size === 0) return events;\n\n return events.map((event) => {\n const consumedSessionId = consumedSessionIdsByRunnerInstanceId.get(event.providerRunnerId);\n if (!consumedSessionId || event.runnerSessionId === consumedSessionId) return event;\n return {...event, runnerSessionId: consumedSessionId};\n });\n}\n\nfunction aggregateEvents(\n events: RunnerInstanceReportEvent[],\n receivedAt: Date,\n): RunnerInstanceReportRow[] {\n const byRunnerInstanceId = new Map<string, RunnerInstanceReportRow>();\n for (const rawEvent of events) {\n const event = toRunnerInstanceReportRow(rawEvent, receivedAt);\n const existing = byRunnerInstanceId.get(event.providerRunnerId);\n if (existing) mergeMilestones(existing, event);\n if (!existing || compareRunnerInstanceReportEvents(event, existing) > 0) {\n byRunnerInstanceId.set(\n event.providerRunnerId,\n existing ? mergeProjectionMetadata(event, existing) : event,\n );\n }\n }\n return [...byRunnerInstanceId.values()];\n}\n\nfunction toRunnerInstanceReportRow(\n event: RunnerInstanceReportEvent,\n receivedAt: Date,\n): RunnerInstanceReportRow {\n const reportedAt = event.reportedAt > receivedAt ? receivedAt : event.reportedAt;\n return {\n ...event,\n reportedAt,\n startedAt: event.state === 'running' ? reportedAt : null,\n stoppingAt: event.state === 'stopping' ? reportedAt : null,\n stoppedAt: event.state === 'stopped' ? reportedAt : null,\n failedAt: event.state === 'failed' ? reportedAt : null,\n terminatedAt: event.state === 'terminated' ? reportedAt : null,\n };\n}\n\nfunction mergeMilestones(target: RunnerInstanceReportRow, source: RunnerInstanceReportRow) {\n target.startedAt = earliestDate(target.startedAt, source.startedAt);\n target.stoppingAt = earliestDate(target.stoppingAt, source.stoppingAt);\n target.stoppedAt = earliestDate(target.stoppedAt, source.stoppedAt);\n target.failedAt = earliestDate(target.failedAt, source.failedAt);\n target.terminatedAt = earliestDate(target.terminatedAt, source.terminatedAt);\n}\n\nfunction mergeProjectionMetadata(\n event: RunnerInstanceReportRow,\n existing: RunnerInstanceReportRow,\n): RunnerInstanceReportRow {\n return {\n ...event,\n reservationId: event.reservationId ?? existing.reservationId,\n templateKey: event.templateKey ?? existing.templateKey,\n runnerSessionId: event.runnerSessionId ?? existing.runnerSessionId,\n providerKind: event.providerKind ?? existing.providerKind,\n ...pickMilestones(existing),\n };\n}\n\nfunction pickMilestones(event: RunnerInstanceReportRow) {\n return {\n startedAt: event.startedAt,\n stoppingAt: event.stoppingAt,\n stoppedAt: event.stoppedAt,\n failedAt: event.failedAt,\n terminatedAt: event.terminatedAt,\n };\n}\n\nfunction earliestDate(a: Date | null, b: Date | null): Date | null {\n if (!a) return b;\n if (!b) return a;\n return a < b ? a : b;\n}\n\nfunction compareRunnerInstanceReportEvents(\n a: RunnerInstanceReportEvent,\n b: RunnerInstanceReportEvent,\n): number {\n const timeDelta = a.reportedAt.getTime() - b.reportedAt.getTime();\n const rankDelta = getRunnerInstanceStateRank(a.state) - getRunnerInstanceStateRank(b.state);\n if (rankDelta !== 0) return rankDelta;\n return timeDelta;\n}\n\nfunction getRunnerInstanceStateRank(state: RunnerInstanceState): number {\n switch (state) {\n case 'starting':\n return 1;\n case 'running':\n return 2;\n case 'stopping':\n return 3;\n case 'stopped':\n return 4;\n case 'failed':\n return 5;\n case 'terminated':\n return 6;\n }\n}\n\nfunction providerRunnerStateRank(state: SQL | typeof providerRunners.state): SQL<number> {\n return sql<number>`\n CASE ${state}\n WHEN 'starting' THEN 1\n WHEN 'running' THEN 2\n WHEN 'stopping' THEN 3\n WHEN 'stopped' THEN 4\n WHEN 'failed' THEN 5\n WHEN 'terminated' THEN 6\n ELSE 0\n END\n `;\n}\n\nfunction providerRunnerProjectionUpdateCondition(): SQL<boolean> {\n return sql<boolean>`\n ${providerRunnerStateRank(sql`excluded.state`)} > ${providerRunnerStateRank(providerRunners.state)}\n OR (\n ${providerRunnerStateRank(sql`excluded.state`)} = ${providerRunnerStateRank(providerRunners.state)}\n AND excluded.reported_at >= ${providerRunners.reportedAt}\n )\n `;\n}\n\nfunction providerRunnerMilestoneUpdateCondition(): SQL<boolean> {\n return sql<boolean>`\n ${milestoneNeedsUpdate(providerRunners.startedAt, sql`excluded.started_at`)}\n OR ${milestoneNeedsUpdate(providerRunners.stoppingAt, sql`excluded.stopping_at`)}\n OR ${milestoneNeedsUpdate(providerRunners.stoppedAt, sql`excluded.stopped_at`)}\n OR ${milestoneNeedsUpdate(providerRunners.failedAt, sql`excluded.failed_at`)}\n OR ${milestoneNeedsUpdate(providerRunners.terminatedAt, sql`excluded.terminated_at`)}\n `;\n}\n\nfunction milestoneNeedsUpdate(\n current: SQL | RunnerInstanceMilestoneColumn,\n incoming: SQL,\n): SQL<boolean> {\n return sql<boolean>`${incoming} IS NOT NULL AND (${current} IS NULL OR ${incoming} < ${current})`;\n}\n\nfunction firstObservedAt(current: SQL | RunnerInstanceMilestoneColumn, incoming: SQL) {\n return sql`\n CASE\n WHEN ${incoming} IS NULL THEN ${current}\n WHEN ${current} IS NULL THEN ${incoming}\n ELSE least(${current}, ${incoming})\n END\n `;\n}\n\nexport function isTerminalState(state: RunnerInstanceState): boolean {\n return terminalStates.includes(state as (typeof terminalStates)[number]);\n}\n\nfunction isDivergenceCountState(\n state: RunnerInstanceState,\n): state is (typeof divergenceCountStates)[number] {\n return divergenceCountStates.includes(state as (typeof divergenceCountStates)[number]);\n}\n"],"names":["logger","and","asc","desc","eq","exists","gt","inArray","isNotNull","isNull","lt","notExists","notInArray","or","sql","alias","config","sanitizeRunnerLabels","recordRunnerReservationCapacityFailure","db","listRunningJobExecutionsByRunnerInstanceTx","lockRunnerReservationAdvisoryKeysTx","releaseReservationUnits","validateRunnerReservationCapacityTx","terminalStates","ephemeralRegistrationTokens","provisionerTokens","reservations","runnerControlSessions","providerRunners","toRunnerInstance","runnerSessions","runningJobExecutions","activeStates","divergenceCountStates","attachRunnerInstanceProviderId","params","updated","update","set","providerRunnerId","updatedAt","where","id","runnerInstanceId","provisionerId","state","returning","length","reportRunnerInstances","events","accepted","reservationsReleased","terminateIntentsHonored","transaction","tx","receivedAt","Date","aggregatedEvents","aggregateEvents","hasTerminalEvent","some","event","isTerminalState","execute","workspaceId","hydrateRunnerSessionIdsFromConsumedTokens","reservationSafeEvents","guardReportedReservationIdsTx","listTerminateIntentsHonoredByTerminatedReportsTx","values","map","reservationId","templateKey","labels","scope","logLevel","source","reason","runnerSessionId","providerKind","reportedAt","startedAt","stoppingAt","stoppedAt","failedAt","terminatedAt","insert","onConflictDoUpdate","target","targetWhere","providerRunnerProjectionUpdateCondition","firstObservedAt","setWhere","providerRunnerMilestoneUpdateCondition","releaseTerminalRunnerInstanceReservations","reservationIds","Set","flatMap","sort","providerRunnerIds","existingRows","select","intendedReservationId","reservationReleasedAt","from","for","existingByProviderRunnerId","Map","row","candidateReservationByProviderRunnerId","existing","get","validation","requests","count","advisoryLocksHeld","unavailableByReservation","remainingAcceptedByReservation","acceptedByReservation","matchesExistingReservation","undefined","remaining","listActiveRunnerInstanceCountsByTemplateTx","rows","groupBy","isDivergenceCountState","countStaleEnrolledRunnerInstances","staleRunnerInstanceCutoff","graceSeconds","closedAt","expiresAt","listProviderRunnerByPhaseMetrics","phase","createdAt","assignedAt","provider","launchKind","oldestAgeMilliseconds","leftJoin","Math","max","listActiveRunnerInstances","windowSeconds","orderBy","limit","listProvisionerTerminateIntents","listProvisionerTerminateIntentRowsTx","provisionerTerminateIntentsQuery","truncated","returnedRows","slice","warn","returnedCount","activationTimeoutRunnerIds","toRunnerInstanceTerminateIntent","activationTimeoutRetry","newerRunningJobExecutions","latestCancelledJob","cancellationRequestedAt","jobExecutionId","activationTimeout","RUNNER_DEMAND_ACTIVATION_TIMEOUT_SECONDS","terminatedRunnerInstanceIds","filter","reconcileRunnerInstances","observedRunnerInstanceIds","absentIds","staleAbsentRows","terminateGraceSeconds","releaseTerminalRunnerInstanceReservationsByIds","observedRows","boundJobExecutions","boundJobExecutionsByRunnerInstanceId","jobExecution","reapStaleRunnerInstances","cutoff","thresholdSeconds","candidateRows","staleRunnerInstanceWhere","reaped","workspaceIds","updatedRows","group","groupRunnerInstanceIds","requireUnlinkedSession","terminalEvents","reservationWorkspacePredicate","releaseReservationId","releaseReservationWorkspaceId","releasesByReservationId","updatedIds","has","key","release","size","released","releases","lastSeenAt","groups","push","tokenRows","consumedSessionId","consumedAt","consumedSessionIdsByRunnerInstanceId","byRunnerInstanceId","rawEvent","toRunnerInstanceReportRow","mergeMilestones","compareRunnerInstanceReportEvents","mergeProjectionMetadata","earliestDate","pickMilestones","a","b","timeDelta","getTime","rankDelta","getRunnerInstanceStateRank","providerRunnerStateRank","milestoneNeedsUpdate","current","incoming","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/db/runner-instances.ts"],"sourcesContent":["import {logger} from '@shipfox/node-opentelemetry';\nimport {\n and,\n asc,\n desc,\n eq,\n exists,\n gt,\n inArray,\n isNotNull,\n isNull,\n lt,\n notExists,\n notInArray,\n or,\n type SQL,\n sql,\n} from 'drizzle-orm';\nimport {alias} from 'drizzle-orm/pg-core';\nimport {config} from '#config.js';\nimport type {RunnerInstance, RunnerInstanceState} from '#core/entities/runner-instance.js';\nimport {sanitizeRunnerLabels} from '#core/runner-labels.js';\nimport {recordRunnerReservationCapacityFailure} from '#metrics/index.js';\nimport type {Tx} from './db.js';\nimport {db} from './db.js';\nimport {\n listRunningJobExecutionsByRunnerInstanceTx,\n type RunnerInstanceBoundJobExecution,\n} from './job-executions.js';\nimport {lockRunnerReservationAdvisoryKeysTx} from './reservation-locks.js';\nimport {releaseTerminalRunnerInstanceReservationsByIds} from './reservations.js';\nimport {validateRunnerReservationCapacityTx} from './runner-assignments.js';\nimport {activeStates, terminalStates} from './runner-states.js';\nimport {ephemeralRegistrationTokens} from './schema/ephemeral-registration-tokens.js';\nimport {provisionerTokens} from './schema/provisioner-tokens.js';\nimport {reservations} from './schema/reservations.js';\nimport {runnerControlSessions} from './schema/runner-control-sessions.js';\nimport {providerRunners, toRunnerInstance} from './schema/runner-instances.js';\nimport {runnerSessions} from './schema/runner-sessions.js';\nimport {runningJobExecutions} from './schema/running-job-executions.js';\n\nexport const divergenceCountStates = ['starting', 'running'] as const satisfies readonly Extract<\n RunnerInstanceState,\n 'starting' | 'running'\n>[];\n\nexport type RunnerInstanceTerminateIntentReason = 'activation-timeout' | 'job-cancelled';\n\nexport interface RunnerInstanceTerminateIntent {\n providerRunnerId: string;\n reason: RunnerInstanceTerminateIntentReason;\n activationTimeoutRetry?: boolean;\n}\n\nexport interface ActiveRunnerInstanceTemplateCount {\n templateKey: string;\n state: (typeof divergenceCountStates)[number];\n count: number;\n}\n\nexport interface RunnerInstanceReportEvent {\n providerRunnerId: string;\n reservationId: string | null;\n templateKey: string | null;\n labels: string[];\n state: RunnerInstanceState;\n reason: string | null;\n runnerSessionId: string | null;\n providerKind: string | null;\n reportedAt: Date;\n}\n\nexport interface ReportRunnerInstancesParams {\n scope: 'installation' | 'workspace';\n workspaceId: string | null;\n provisionerId: string;\n events: RunnerInstanceReportEvent[];\n}\n\nexport interface ReconcileRunnerInstancesParams {\n workspaceId: string | null;\n provisionerId: string;\n observedRunnerInstanceIds: string[];\n terminateGraceSeconds: number;\n}\n\nexport interface ReconcileRunnerInstancesDbResult {\n observedRows: RunnerInstance[];\n boundJobExecutionsByRunnerInstanceId: Map<string, RunnerInstanceBoundJobExecution>;\n absentIds: string[];\n reservationsReleased: number;\n}\n\nexport interface ReapStaleRunnerInstancesResult {\n reaped: number;\n reservationsReleased: number;\n}\n\nexport async function attachRunnerInstanceProviderId(params: {\n runnerInstanceId: string;\n provisionerId: string;\n providerRunnerId: string;\n}): Promise<boolean> {\n const updated = await db()\n .update(providerRunners)\n .set({providerRunnerId: params.providerRunnerId, updatedAt: sql`now()`})\n .where(\n and(\n eq(providerRunners.id, params.runnerInstanceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n isNull(providerRunners.providerRunnerId),\n notInArray(providerRunners.state, [...terminalStates]),\n ),\n )\n .returning({id: providerRunners.id});\n return updated.length === 1;\n}\n\ninterface RunnerInstanceReportRow extends RunnerInstanceReportEvent {\n startedAt: Date | null;\n stoppingAt: Date | null;\n stoppedAt: Date | null;\n failedAt: Date | null;\n terminatedAt: Date | null;\n}\n\ntype RunnerInstanceMilestoneColumn =\n | typeof providerRunners.startedAt\n | typeof providerRunners.stoppingAt\n | typeof providerRunners.stoppedAt\n | typeof providerRunners.failedAt\n | typeof providerRunners.terminatedAt;\n\nexport async function reportRunnerInstances(params: ReportRunnerInstancesParams): Promise<{\n accepted: number;\n reservationsReleased: number;\n terminateIntentsHonored: RunnerInstanceTerminateIntent[];\n}> {\n if (params.events.length === 0)\n return {accepted: 0, reservationsReleased: 0, terminateIntentsHonored: []};\n\n return await db().transaction(async (tx) => {\n const receivedAt = new Date();\n const aggregatedEvents = aggregateEvents(params.events, receivedAt);\n const hasTerminalEvent = aggregatedEvents.some((event) => isTerminalState(event.state));\n\n if (hasTerminalEvent) {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId ?? params.provisionerId}))`,\n );\n }\n\n const events = await hydrateRunnerSessionIdsFromConsumedTokens(tx, params, aggregatedEvents);\n const reservationSafeEvents = await guardReportedReservationIdsTx(tx, params, events);\n const existingReportedAtByProviderRunnerId = hasTerminalEvent\n ? await listExistingProviderRunnerReportedAtTx(tx, params, reservationSafeEvents)\n : new Map<string, Date>();\n const freshTerminalEvents = reservationSafeEvents.filter((event) => {\n if (!isTerminalState(event.state)) return false;\n const existingReportedAt = existingReportedAtByProviderRunnerId.get(event.providerRunnerId);\n return existingReportedAt === undefined || event.reportedAt >= existingReportedAt;\n });\n const terminateIntentsHonored = await listTerminateIntentsHonoredByTerminatedReportsTx(\n tx,\n params,\n reservationSafeEvents,\n );\n\n const values = reservationSafeEvents.map((event) => ({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerId: event.providerRunnerId,\n reservationId: event.reservationId,\n templateKey: event.templateKey,\n labels: sanitizeRunnerLabels(event.labels, {\n scope: params.scope,\n logLevel: 'debug',\n source: 'runner instance report',\n }),\n state: event.state,\n reason: event.reason,\n runnerSessionId: event.runnerSessionId,\n providerKind: event.providerKind,\n reportedAt: event.reportedAt > receivedAt ? receivedAt : event.reportedAt,\n startedAt: event.startedAt,\n stoppingAt: event.stoppingAt,\n stoppedAt: event.stoppedAt,\n failedAt: event.failedAt,\n terminatedAt: event.terminatedAt,\n }));\n\n await tx\n .insert(providerRunners)\n .values(values)\n .onConflictDoUpdate({\n target: [providerRunners.provisionerId, providerRunners.providerRunnerId],\n targetWhere: isNotNull(providerRunners.providerRunnerId),\n set: {\n reservationId: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN coalesce(${providerRunners.reservationId}, excluded.reservation_id) ELSE ${providerRunners.reservationId} END`,\n templateKey: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN coalesce(excluded.template_key, ${providerRunners.templateKey}) ELSE ${providerRunners.templateKey} END`,\n labels: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN excluded.labels ELSE ${providerRunners.labels} END`,\n state: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN excluded.state ELSE ${providerRunners.state} END`,\n reason: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN excluded.reason ELSE ${providerRunners.reason} END`,\n runnerSessionId: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN coalesce(${providerRunners.runnerSessionId}, excluded.runner_session_id) ELSE ${providerRunners.runnerSessionId} END`,\n providerKind: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN coalesce(excluded.provider_kind, ${providerRunners.providerKind}) ELSE ${providerRunners.providerKind} END`,\n reportedAt: sql`CASE WHEN ${providerRunnerProjectionUpdateCondition()} THEN excluded.reported_at ELSE ${providerRunners.reportedAt} END`,\n startedAt: firstObservedAt(providerRunners.startedAt, sql`excluded.started_at`),\n stoppingAt: firstObservedAt(providerRunners.stoppingAt, sql`excluded.stopping_at`),\n stoppedAt: firstObservedAt(providerRunners.stoppedAt, sql`excluded.stopped_at`),\n failedAt: firstObservedAt(providerRunners.failedAt, sql`excluded.failed_at`),\n terminatedAt: firstObservedAt(providerRunners.terminatedAt, sql`excluded.terminated_at`),\n updatedAt: sql`now()`,\n },\n setWhere: sql`\n ${providerRunnerProjectionUpdateCondition()}\n OR ${providerRunnerMilestoneUpdateCondition()}\n `,\n });\n\n const reservationsReleased =\n freshTerminalEvents.length > 0\n ? await releaseTerminalRunnerInstanceReservations(tx, params, freshTerminalEvents)\n : 0;\n\n return {\n accepted: reservationSafeEvents.length,\n reservationsReleased,\n terminateIntentsHonored,\n };\n });\n}\n\nasync function listExistingProviderRunnerReportedAtTx(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportRow[],\n): Promise<Map<string, Date>> {\n const providerRunnerIds = [...new Set(events.map((event) => event.providerRunnerId))];\n if (providerRunnerIds.length === 0) return new Map();\n\n const rows = await tx\n .select({\n providerRunnerId: providerRunners.providerRunnerId,\n reportedAt: providerRunners.reportedAt,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, providerRunnerIds),\n ),\n );\n return new Map(\n rows.flatMap((row) =>\n row.providerRunnerId ? [[row.providerRunnerId, row.reportedAt] as const] : [],\n ),\n );\n}\n\nasync function guardReportedReservationIdsTx(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportRow[],\n): Promise<RunnerInstanceReportRow[]> {\n const reportedReservationIds = [\n ...new Set(events.flatMap((event) => (event.reservationId ? [event.reservationId] : []))),\n ].sort();\n const providerRunnerIds = [...new Set(events.map((event) => event.providerRunnerId))];\n if (reportedReservationIds.length === 0 && !events.some((event) => isTerminalState(event.state)))\n return events;\n\n // Lock every reservation currently associated with the reported runners before taking a\n // runner row lock. Terminal reports may omit reservationId, or carry a stale one; discovering\n // the stored IDs here keeps report projection in the same reservation-then-runner order as\n // assignment and terminal cleanup.\n const existingReservationRows = await tx\n .select({\n reservationId: providerRunners.reservationId,\n intendedReservationId: providerRunners.intendedReservationId,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, providerRunnerIds),\n ),\n );\n const storedReservationIds = existingReservationRows.flatMap((row) =>\n [row.reservationId, row.intendedReservationId].filter(\n (reservationId): reservationId is string => reservationId !== null,\n ),\n );\n const reservationIds = [...new Set([...reportedReservationIds, ...storedReservationIds])].sort();\n if (reservationIds.length > 0)\n await lockRunnerReservationAdvisoryKeysTx(tx, {\n provisionerId: params.provisionerId,\n reservationIds,\n });\n\n const existingRows = await tx\n .select({\n providerRunnerId: providerRunners.providerRunnerId,\n reservationId: providerRunners.reservationId,\n intendedReservationId: providerRunners.intendedReservationId,\n reservationReleasedAt: providerRunners.reservationReleasedAt,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, providerRunnerIds),\n ),\n )\n .for('update');\n const existingByProviderRunnerId = new Map(\n existingRows.flatMap((row) =>\n row.providerRunnerId ? [[row.providerRunnerId, row] as const] : [],\n ),\n );\n const candidateReservationByProviderRunnerId = new Map<string, string>();\n for (const event of events) {\n if (!event.reservationId) continue;\n if (isTerminalState(event.state)) continue;\n const existing = existingByProviderRunnerId.get(event.providerRunnerId);\n if (existing?.reservationId || existing?.intendedReservationId === event.reservationId)\n continue;\n if (existing?.intendedReservationId || existing?.reservationReleasedAt) continue;\n candidateReservationByProviderRunnerId.set(event.providerRunnerId, event.reservationId);\n }\n\n const validation = await validateRunnerReservationCapacityTx(\n tx,\n {\n provisionerId: params.provisionerId,\n requests: [...candidateReservationByProviderRunnerId.values()].map((reservationId) => ({\n reservationId,\n count: 1,\n })),\n },\n {advisoryLocksHeld: true},\n );\n for (const {reason, count} of validation.unavailableByReservation.values())\n recordRunnerReservationCapacityFailure(reason, count);\n\n const remainingAcceptedByReservation = new Map(validation.acceptedByReservation);\n return events.map((event) => {\n const existing = existingByProviderRunnerId.get(event.providerRunnerId);\n const reservationId = candidateReservationByProviderRunnerId.get(event.providerRunnerId);\n if (!reservationId) {\n if (event.reservationId && isTerminalState(event.state)) {\n // Terminal cleanup releases the IDs stored on the projection row. An arbitrary\n // terminal report must not consume reservation capacity during that cleanup.\n const matchesExistingReservation =\n existing !== undefined &&\n (existing.reservationId === event.reservationId ||\n existing.intendedReservationId === event.reservationId);\n if (!matchesExistingReservation) return {...event, reservationId: null};\n }\n if (\n event.reservationId &&\n existing?.intendedReservationId &&\n existing.intendedReservationId !== event.reservationId\n )\n return {...event, reservationId: null};\n if (event.reservationId && existing?.reservationReleasedAt)\n return {...event, reservationId: null};\n return event;\n }\n const remaining = remainingAcceptedByReservation.get(reservationId) ?? 0;\n if (remaining === 0) return {...event, reservationId: null};\n remainingAcceptedByReservation.set(reservationId, remaining - 1);\n return event;\n });\n}\n\nexport async function listActiveRunnerInstanceCountsByTemplateTx(\n tx: Tx,\n params: {workspaceId: string; provisionerId: string},\n): Promise<ActiveRunnerInstanceTemplateCount[]> {\n const rows = await tx\n .select({\n templateKey: providerRunners.templateKey,\n state: providerRunners.state,\n count: sql<number>`count(*)::int`,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.state, divergenceCountStates),\n isNotNull(providerRunners.templateKey),\n ),\n )\n .groupBy(providerRunners.templateKey, providerRunners.state);\n\n return rows.flatMap((row) =>\n row.templateKey && isDivergenceCountState(row.state)\n ? [{templateKey: row.templateKey, state: row.state, count: row.count}]\n : [],\n );\n}\n\nexport async function countStaleEnrolledRunnerInstances(params: {\n graceSeconds: number;\n}): Promise<number> {\n const [row] = await db()\n .select({count: sql<number>`count(*)::int`})\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.state, 'running'),\n isNull(providerRunners.workspaceId),\n isNull(providerRunners.runnerSessionId),\n lt(providerRunners.reportedAt, staleRunnerInstanceCutoff(params.graceSeconds)),\n exists(\n db()\n .select({id: runnerControlSessions.id})\n .from(runnerControlSessions)\n .where(\n and(\n eq(runnerControlSessions.runnerInstanceId, providerRunners.id),\n isNull(runnerControlSessions.closedAt),\n gt(runnerControlSessions.expiresAt, sql`now()`),\n ),\n ),\n ),\n ),\n );\n\n return row?.count ?? 0;\n}\n\nexport type ProviderRunnerPhase =\n | 'control_session'\n | 'enrollment'\n | 'assignment'\n | 'activation'\n | 'idle';\n\nexport interface ProviderRunnerPhaseMetric {\n phase: ProviderRunnerPhase;\n provider: string;\n launchKind: 'demand' | 'warm' | 'manual';\n count: number;\n oldestAgeMilliseconds: number;\n}\n\nexport async function listProviderRunnerByPhaseMetrics(): Promise<ProviderRunnerPhaseMetric[]> {\n const phase = sql<ProviderRunnerPhase>`case\n when ${runnerControlSessions.id} is null then 'control_session'\n when ${providerRunners.state} <> 'running' then 'enrollment'\n when ${providerRunners.intendedReservationId} is not null\n and ${providerRunners.workspaceId} is null then 'assignment'\n when ${providerRunners.workspaceId} is not null then 'activation'\n else 'idle'\n end`;\n const startedAt = sql<Date | null>`case\n when ${runnerControlSessions.id} is null then ${providerRunners.createdAt}\n when ${providerRunners.state} <> 'running' then ${runnerControlSessions.createdAt}\n when ${providerRunners.intendedReservationId} is not null\n and ${providerRunners.workspaceId} is null then ${runnerControlSessions.createdAt}\n when ${providerRunners.workspaceId} is not null\n then coalesce(${providerRunners.assignedAt}, ${runnerControlSessions.createdAt})\n else coalesce(\n ${runnerControlSessions.createdAt},\n ${providerRunners.assignedAt},\n ${providerRunners.createdAt}\n )\n end`;\n const rows = await db()\n .select({\n phase,\n provider: sql<string>`coalesce(${providerRunners.providerKind}, 'unknown')`,\n launchKind: providerRunners.launchKind,\n count: sql<number>`count(*)::int`,\n oldestAgeMilliseconds: sql<number>`coalesce(\n max(extract(epoch from (now() - (${startedAt}))) * 1000),\n 0\n )::double precision`,\n })\n .from(providerRunners)\n .leftJoin(\n runnerControlSessions,\n and(\n eq(runnerControlSessions.runnerInstanceId, providerRunners.id),\n isNull(runnerControlSessions.closedAt),\n gt(runnerControlSessions.expiresAt, sql`now()`),\n ),\n )\n .where(\n and(\n inArray(providerRunners.state, ['starting', 'running']),\n isNull(providerRunners.runnerSessionId),\n ),\n )\n .groupBy(phase, providerRunners.providerKind, providerRunners.launchKind);\n\n return rows.map((row) => ({\n phase: row.phase,\n provider: row.provider,\n launchKind: row.launchKind,\n count: row.count,\n oldestAgeMilliseconds: Math.max(0, row.oldestAgeMilliseconds),\n }));\n}\n\nexport async function listActiveRunnerInstances(params: {\n workspaceId: string;\n windowSeconds: number;\n limit?: number;\n}): Promise<RunnerInstance[]> {\n const rows = await db()\n .select()\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n inArray(providerRunners.state, activeStates),\n sql`${providerRunners.updatedAt} > now() - (${params.windowSeconds} || ' seconds')::interval`,\n ),\n )\n .orderBy(desc(providerRunners.updatedAt), desc(providerRunners.id))\n .limit(params.limit ?? 1000);\n\n return rows.map(toRunnerInstance);\n}\n\nexport async function listProvisionerTerminateIntents(params: {\n workspaceId: string;\n provisionerId: string;\n limit: number;\n}): Promise<string[]> {\n return await db().transaction(async (tx) => {\n const rows = await listProvisionerTerminateIntentRowsTx(tx, params);\n return rows.map((row) => row.providerRunnerId);\n });\n}\n\nexport async function listProvisionerTerminateIntentRowsTx(\n tx: Tx,\n params: {\n workspaceId: string;\n provisionerId: string;\n limit: number;\n },\n): Promise<RunnerInstanceTerminateIntent[]> {\n const rows = await provisionerTerminateIntentsQuery(tx, params)\n .orderBy(asc(providerRunners.providerRunnerId))\n .limit(params.limit + 1);\n\n const truncated = rows.length > params.limit;\n const returnedRows = truncated ? rows.slice(0, params.limit) : rows;\n if (truncated) {\n logger().warn(\n {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n limit: params.limit,\n returnedCount: returnedRows.length,\n },\n 'provisioner terminate intents truncated by poll-demand limit',\n );\n }\n\n const activationTimeoutRunnerIds = returnedRows.flatMap((row) =>\n row.reason === 'activation-timeout' && row.providerRunnerId ? [row.providerRunnerId] : [],\n );\n if (activationTimeoutRunnerIds.length > 0) {\n await tx\n .update(providerRunners)\n .set({reservationReleasedAt: sql`now()`, updatedAt: sql`now()`})\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, activationTimeoutRunnerIds),\n isNull(providerRunners.reservationReleasedAt),\n ),\n );\n }\n\n return returnedRows.flatMap((row) => toRunnerInstanceTerminateIntent(row));\n}\n\nfunction toRunnerInstanceTerminateIntent(row: {\n providerRunnerId: string | null;\n reason: RunnerInstanceTerminateIntentReason;\n activationTimeoutRetry: boolean;\n}): RunnerInstanceTerminateIntent[] {\n if (!row.providerRunnerId) return [];\n\n return [\n {\n providerRunnerId: row.providerRunnerId,\n reason: row.reason,\n ...(row.reason === 'activation-timeout' && row.activationTimeoutRetry\n ? {activationTimeoutRetry: true}\n : {}),\n },\n ];\n}\n\nfunction provisionerTerminateIntentsQuery(\n tx: Tx,\n params: {workspaceId: string; provisionerId: string; providerRunnerIds?: string[]},\n) {\n const newerRunningJobExecutions = alias(runningJobExecutions, 'newer_running_jobs');\n const latestCancelledJob = exists(\n tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, params.workspaceId),\n eq(runningJobExecutions.provisionerId, params.provisionerId),\n eq(runningJobExecutions.providerRunnerId, providerRunners.providerRunnerId),\n isNotNull(runningJobExecutions.cancellationRequestedAt),\n notExists(\n tx\n .select({id: newerRunningJobExecutions.id})\n .from(newerRunningJobExecutions)\n .where(\n and(\n eq(newerRunningJobExecutions.workspaceId, runningJobExecutions.workspaceId),\n eq(newerRunningJobExecutions.provisionerId, runningJobExecutions.provisionerId),\n eq(\n newerRunningJobExecutions.providerRunnerId,\n runningJobExecutions.providerRunnerId,\n ),\n or(\n gt(newerRunningJobExecutions.startedAt, runningJobExecutions.startedAt),\n and(\n eq(newerRunningJobExecutions.startedAt, runningJobExecutions.startedAt),\n gt(\n newerRunningJobExecutions.jobExecutionId,\n runningJobExecutions.jobExecutionId,\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n );\n const activationTimeout = and(\n eq(providerRunners.launchKind, 'demand'),\n isNull(providerRunners.runnerSessionId),\n lt(\n providerRunners.createdAt,\n sql`now() - (${config.RUNNER_DEMAND_ACTIVATION_TIMEOUT_SECONDS} || ' seconds')::interval`,\n ),\n notExists(\n tx\n .select({id: reservations.id})\n .from(reservations)\n .where(\n and(\n or(\n eq(reservations.id, providerRunners.reservationId),\n eq(reservations.id, providerRunners.intendedReservationId),\n ),\n eq(reservations.workspaceId, params.workspaceId),\n eq(reservations.provisionerId, params.provisionerId),\n gt(reservations.expiresAt, sql`now()`),\n ),\n ),\n ),\n );\n\n return tx\n .select({\n providerRunnerId: providerRunners.providerRunnerId,\n activationTimeoutRetry: sql<boolean>`${providerRunners.reservationReleasedAt} is not null`,\n reason: sql<RunnerInstanceTerminateIntentReason>`case\n when ${activationTimeout} then 'activation-timeout'\n else 'job-cancelled'\n end`,\n })\n .from(providerRunners)\n .where(\n and(\n eq(providerRunners.workspaceId, params.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n isNotNull(providerRunners.providerRunnerId),\n inArray(providerRunners.state, activeStates),\n params.providerRunnerIds && params.providerRunnerIds.length > 0\n ? inArray(providerRunners.providerRunnerId, params.providerRunnerIds)\n : undefined,\n or(latestCancelledJob, activationTimeout),\n ),\n );\n}\n\nasync function listTerminateIntentsHonoredByTerminatedReportsTx(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportEvent[],\n): Promise<RunnerInstanceTerminateIntent[]> {\n if (!params.workspaceId) return [];\n const terminatedRunnerInstanceIds = [\n ...new Set(\n events.filter((event) => event.state === 'terminated').map((event) => event.providerRunnerId),\n ),\n ];\n if (terminatedRunnerInstanceIds.length === 0) return [];\n\n const rows = await provisionerTerminateIntentsQuery(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: terminatedRunnerInstanceIds,\n }).orderBy(asc(providerRunners.providerRunnerId));\n return rows.flatMap((row) => toRunnerInstanceTerminateIntent(row));\n}\n\nexport async function reconcileRunnerInstances(\n params: ReconcileRunnerInstancesParams,\n): Promise<ReconcileRunnerInstancesDbResult> {\n const observedRunnerInstanceIds = [...new Set(params.observedRunnerInstanceIds)];\n\n return await db().transaction(async (tx) => {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId ?? params.provisionerId}))`,\n );\n\n let absentIds: string[] = [];\n let reservationsReleased = 0;\n if (observedRunnerInstanceIds.length > 0) {\n const staleAbsentRows = await tx\n .select({\n id: providerRunners.id,\n providerRunnerId: providerRunners.providerRunnerId,\n })\n .from(providerRunners)\n .where(\n and(\n params.workspaceId\n ? eq(providerRunners.workspaceId, params.workspaceId)\n : isNull(providerRunners.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.state, activeStates),\n lt(\n providerRunners.reportedAt,\n sql`now() - (${params.terminateGraceSeconds} || ' seconds')::interval`,\n ),\n notInArray(providerRunners.providerRunnerId, observedRunnerInstanceIds),\n ),\n );\n\n if (staleAbsentRows.length > 0) {\n const updated = await tx\n .update(providerRunners)\n .set({\n state: 'terminated',\n terminatedAt: sql`coalesce(${providerRunners.terminatedAt}, now())`,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n inArray(\n providerRunners.id,\n staleAbsentRows.map((row) => row.id),\n ),\n inArray(providerRunners.state, activeStates),\n lt(\n providerRunners.reportedAt,\n sql`now() - (${params.terminateGraceSeconds} || ' seconds')::interval`,\n ),\n ),\n )\n .returning({id: providerRunners.id, providerRunnerId: providerRunners.providerRunnerId});\n\n absentIds = updated.flatMap((row) => (row.providerRunnerId ? [row.providerRunnerId] : []));\n reservationsReleased = await releaseTerminalRunnerInstanceReservationsByIds(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n runnerInstanceIds: updated.map((row) => row.id),\n requireUnlinkedSession: false,\n });\n }\n }\n\n const observedRows =\n observedRunnerInstanceIds.length === 0\n ? []\n : (\n await tx\n .select()\n .from(providerRunners)\n .where(\n and(\n params.workspaceId\n ? eq(providerRunners.workspaceId, params.workspaceId)\n : isNull(providerRunners.workspaceId),\n eq(providerRunners.provisionerId, params.provisionerId),\n inArray(providerRunners.providerRunnerId, observedRunnerInstanceIds),\n ),\n )\n ).map(toRunnerInstance);\n\n const boundJobExecutions = params.workspaceId\n ? await listRunningJobExecutionsByRunnerInstanceTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: observedRunnerInstanceIds,\n })\n : [];\n\n return {\n observedRows,\n boundJobExecutionsByRunnerInstanceId: new Map(\n boundJobExecutions.map((jobExecution) => [jobExecution.providerRunnerId, jobExecution]),\n ),\n absentIds,\n reservationsReleased,\n };\n });\n}\n\nexport async function reapStaleRunnerInstances(params: {\n thresholdSeconds: number;\n limit: number;\n}): Promise<ReapStaleRunnerInstancesResult> {\n const cutoff = staleRunnerInstanceCutoff(params.thresholdSeconds);\n\n return await db().transaction(async (tx) => {\n const candidateRows = await tx\n .select({\n id: providerRunners.id,\n workspaceId: providerRunners.workspaceId,\n provisionerId: providerRunners.provisionerId,\n providerRunnerId: providerRunners.providerRunnerId,\n })\n .from(providerRunners)\n .where(staleRunnerInstanceWhere(tx, cutoff))\n .orderBy(asc(providerRunners.updatedAt), asc(providerRunners.id))\n .limit(params.limit);\n\n const terminalReservationRows =\n candidateRows.length === 0\n ? await tx\n .select({\n id: providerRunners.id,\n workspaceId: providerRunners.workspaceId,\n provisionerId: providerRunners.provisionerId,\n providerRunnerId: providerRunners.providerRunnerId,\n })\n .from(providerRunners)\n .where(\n and(\n inArray(providerRunners.state, terminalStates),\n isNotNull(providerRunners.runnerSessionId),\n lt(providerRunners.updatedAt, cutoff),\n isNull(providerRunners.reservationReleasedAt),\n or(\n isNotNull(providerRunners.reservationId),\n isNotNull(providerRunners.intendedReservationId),\n ),\n ),\n )\n .orderBy(asc(providerRunners.updatedAt), asc(providerRunners.id))\n .limit(params.limit)\n : [];\n\n if (candidateRows.length === 0 && terminalReservationRows.length === 0)\n return {reaped: 0, reservationsReleased: 0};\n\n const workspaceIds = [\n ...new Set(\n [...candidateRows, ...terminalReservationRows].flatMap((row) =>\n row.workspaceId ? [row.workspaceId] : [],\n ),\n ),\n ].sort();\n for (const workspaceId of workspaceIds) {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${workspaceId}))`);\n }\n\n const updatedRows = await tx\n .update(providerRunners)\n .set({\n state: 'failed',\n reason: 'stale-provisioner',\n failedAt: sql`coalesce(${providerRunners.failedAt}, now())`,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n inArray(\n providerRunners.id,\n candidateRows.map((row) => row.id),\n ),\n staleRunnerInstanceWhere(tx, cutoff),\n ),\n )\n .returning({\n id: providerRunners.id,\n workspaceId: providerRunners.workspaceId,\n provisionerId: providerRunners.provisionerId,\n providerRunnerId: providerRunners.providerRunnerId,\n });\n\n let reservationsReleased = 0;\n for (const group of groupRunnerInstanceIds(updatedRows)) {\n reservationsReleased += await releaseTerminalRunnerInstanceReservationsByIds(tx, {\n workspaceId: group.workspaceId,\n provisionerId: group.provisionerId,\n runnerInstanceIds: group.runnerInstanceIds,\n requireUnlinkedSession: false,\n });\n }\n for (const group of groupRunnerInstanceIds(terminalReservationRows)) {\n reservationsReleased += await releaseTerminalRunnerInstanceReservationsByIds(tx, {\n workspaceId: group.workspaceId,\n provisionerId: group.provisionerId,\n runnerInstanceIds: group.runnerInstanceIds,\n requireUnlinkedSession: false,\n });\n }\n\n return {reaped: updatedRows.length, reservationsReleased};\n });\n}\n\nasync function releaseTerminalRunnerInstanceReservations(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportEvent[],\n): Promise<number> {\n const terminalEvents = events.filter((event) => isTerminalState(event.state));\n if (terminalEvents.length === 0) return 0;\n\n return await releaseTerminalRunnerInstanceReservationsByIds(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n providerRunnerIds: terminalEvents.map((event) => event.providerRunnerId),\n reportedAtByProviderRunnerId: new Map(\n terminalEvents.map((event) => [event.providerRunnerId, event.reportedAt]),\n ),\n requireUnlinkedSession: false,\n });\n}\n\nfunction staleRunnerInstanceCutoff(thresholdSeconds: number): SQL {\n return sql`now() - (${thresholdSeconds} || ' seconds')::interval`;\n}\n\nfunction staleRunnerInstanceWhere(tx: Tx, cutoff: SQL): SQL<boolean> {\n return and(\n inArray(providerRunners.state, activeStates),\n lt(providerRunners.reportedAt, cutoff),\n lt(providerRunners.updatedAt, cutoff),\n exists(\n tx\n .select({id: provisionerTokens.id})\n .from(provisionerTokens)\n .where(\n and(\n eq(provisionerTokens.id, providerRunners.provisionerId),\n or(isNull(provisionerTokens.lastSeenAt), lt(provisionerTokens.lastSeenAt, cutoff)),\n ),\n ),\n ),\n notExists(\n tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, providerRunners.workspaceId),\n eq(runningJobExecutions.provisionerId, providerRunners.provisionerId),\n eq(runningJobExecutions.providerRunnerId, providerRunners.providerRunnerId),\n ),\n ),\n ),\n notExists(\n tx\n .select({id: runnerSessions.id})\n .from(runnerSessions)\n .where(\n and(\n eq(runnerSessions.workspaceId, providerRunners.workspaceId),\n eq(runnerSessions.provisionerId, providerRunners.provisionerId),\n eq(runnerSessions.providerRunnerId, providerRunners.providerRunnerId),\n sql`${runnerSessions.updatedAt} >= ${cutoff}`,\n ),\n ),\n ),\n ) as SQL<boolean>;\n}\n\nfunction groupRunnerInstanceIds(\n rows: Array<{\n id: string;\n workspaceId: string | null;\n provisionerId: string;\n providerRunnerId: string | null;\n }>,\n): Array<{\n workspaceId: string | null;\n provisionerId: string;\n runnerInstanceIds: string[];\n}> {\n const groups = new Map<\n string,\n {workspaceId: string | null; provisionerId: string; runnerInstanceIds: string[]}\n >();\n for (const row of rows) {\n const key = `${row.workspaceId ?? ''}:${row.provisionerId}`;\n const group = groups.get(key) ?? {\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n runnerInstanceIds: [],\n };\n group.runnerInstanceIds.push(row.id);\n groups.set(key, group);\n }\n return [...groups.values()];\n}\n\nasync function hydrateRunnerSessionIdsFromConsumedTokens(\n tx: Tx,\n params: ReportRunnerInstancesParams,\n events: RunnerInstanceReportRow[],\n): Promise<RunnerInstanceReportRow[]> {\n if (!params.workspaceId) return events;\n const providerRunnerIds = [...new Set(events.map((event) => event.providerRunnerId))];\n if (providerRunnerIds.length === 0) return events;\n\n const tokenRows = await tx\n .select({\n providerRunnerId: ephemeralRegistrationTokens.providerRunnerId,\n consumedSessionId: ephemeralRegistrationTokens.consumedSessionId,\n })\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n inArray(ephemeralRegistrationTokens.providerRunnerId, providerRunnerIds),\n isNotNull(ephemeralRegistrationTokens.consumedSessionId),\n ),\n )\n .orderBy(\n desc(ephemeralRegistrationTokens.consumedAt),\n desc(ephemeralRegistrationTokens.createdAt),\n );\n\n const consumedSessionIdsByRunnerInstanceId = new Map<string, string>();\n for (const row of tokenRows) {\n if (!row.consumedSessionId) continue;\n if (consumedSessionIdsByRunnerInstanceId.has(row.providerRunnerId)) continue;\n consumedSessionIdsByRunnerInstanceId.set(row.providerRunnerId, row.consumedSessionId);\n }\n\n if (consumedSessionIdsByRunnerInstanceId.size === 0) return events;\n\n return events.map((event) => {\n const consumedSessionId = consumedSessionIdsByRunnerInstanceId.get(event.providerRunnerId);\n if (!consumedSessionId || event.runnerSessionId === consumedSessionId) return event;\n return {...event, runnerSessionId: consumedSessionId};\n });\n}\n\nfunction aggregateEvents(\n events: RunnerInstanceReportEvent[],\n receivedAt: Date,\n): RunnerInstanceReportRow[] {\n const byRunnerInstanceId = new Map<string, RunnerInstanceReportRow>();\n for (const rawEvent of events) {\n const event = toRunnerInstanceReportRow(rawEvent, receivedAt);\n const existing = byRunnerInstanceId.get(event.providerRunnerId);\n if (existing) mergeMilestones(existing, event);\n if (!existing || compareRunnerInstanceReportEvents(event, existing) > 0) {\n byRunnerInstanceId.set(\n event.providerRunnerId,\n existing ? mergeProjectionMetadata(event, existing) : event,\n );\n }\n }\n return [...byRunnerInstanceId.values()];\n}\n\nfunction toRunnerInstanceReportRow(\n event: RunnerInstanceReportEvent,\n receivedAt: Date,\n): RunnerInstanceReportRow {\n const reportedAt = event.reportedAt > receivedAt ? receivedAt : event.reportedAt;\n return {\n ...event,\n reportedAt,\n startedAt: event.state === 'running' ? reportedAt : null,\n stoppingAt: event.state === 'stopping' ? reportedAt : null,\n stoppedAt: event.state === 'stopped' ? reportedAt : null,\n failedAt: event.state === 'failed' ? reportedAt : null,\n terminatedAt: event.state === 'terminated' ? reportedAt : null,\n };\n}\n\nfunction mergeMilestones(target: RunnerInstanceReportRow, source: RunnerInstanceReportRow) {\n target.startedAt = earliestDate(target.startedAt, source.startedAt);\n target.stoppingAt = earliestDate(target.stoppingAt, source.stoppingAt);\n target.stoppedAt = earliestDate(target.stoppedAt, source.stoppedAt);\n target.failedAt = earliestDate(target.failedAt, source.failedAt);\n target.terminatedAt = earliestDate(target.terminatedAt, source.terminatedAt);\n}\n\nfunction mergeProjectionMetadata(\n event: RunnerInstanceReportRow,\n existing: RunnerInstanceReportRow,\n): RunnerInstanceReportRow {\n return {\n ...event,\n reservationId: event.reservationId ?? existing.reservationId,\n templateKey: event.templateKey ?? existing.templateKey,\n runnerSessionId: event.runnerSessionId ?? existing.runnerSessionId,\n providerKind: event.providerKind ?? existing.providerKind,\n ...pickMilestones(existing),\n };\n}\n\nfunction pickMilestones(event: RunnerInstanceReportRow) {\n return {\n startedAt: event.startedAt,\n stoppingAt: event.stoppingAt,\n stoppedAt: event.stoppedAt,\n failedAt: event.failedAt,\n terminatedAt: event.terminatedAt,\n };\n}\n\nfunction earliestDate(a: Date | null, b: Date | null): Date | null {\n if (!a) return b;\n if (!b) return a;\n return a < b ? a : b;\n}\n\nfunction compareRunnerInstanceReportEvents(\n a: RunnerInstanceReportEvent,\n b: RunnerInstanceReportEvent,\n): number {\n const timeDelta = a.reportedAt.getTime() - b.reportedAt.getTime();\n const rankDelta = getRunnerInstanceStateRank(a.state) - getRunnerInstanceStateRank(b.state);\n if (rankDelta !== 0) return rankDelta;\n return timeDelta;\n}\n\nfunction getRunnerInstanceStateRank(state: RunnerInstanceState): number {\n switch (state) {\n case 'starting':\n return 1;\n case 'running':\n return 2;\n case 'stopping':\n return 3;\n case 'stopped':\n return 4;\n case 'failed':\n return 5;\n case 'terminated':\n return 6;\n }\n}\n\nfunction providerRunnerStateRank(state: SQL | typeof providerRunners.state): SQL<number> {\n return sql<number>`\n CASE ${state}\n WHEN 'starting' THEN 1\n WHEN 'running' THEN 2\n WHEN 'stopping' THEN 3\n WHEN 'stopped' THEN 4\n WHEN 'failed' THEN 5\n WHEN 'terminated' THEN 6\n ELSE 0\n END\n `;\n}\n\nfunction providerRunnerProjectionUpdateCondition(): SQL<boolean> {\n return sql<boolean>`\n ${providerRunnerStateRank(sql`excluded.state`)} > ${providerRunnerStateRank(providerRunners.state)}\n OR (\n ${providerRunnerStateRank(sql`excluded.state`)} = ${providerRunnerStateRank(providerRunners.state)}\n AND excluded.reported_at >= ${providerRunners.reportedAt}\n )\n `;\n}\n\nfunction providerRunnerMilestoneUpdateCondition(): SQL<boolean> {\n return sql<boolean>`\n ${milestoneNeedsUpdate(providerRunners.startedAt, sql`excluded.started_at`)}\n OR ${milestoneNeedsUpdate(providerRunners.stoppingAt, sql`excluded.stopping_at`)}\n OR ${milestoneNeedsUpdate(providerRunners.stoppedAt, sql`excluded.stopped_at`)}\n OR ${milestoneNeedsUpdate(providerRunners.failedAt, sql`excluded.failed_at`)}\n OR ${milestoneNeedsUpdate(providerRunners.terminatedAt, sql`excluded.terminated_at`)}\n `;\n}\n\nfunction milestoneNeedsUpdate(\n current: SQL | RunnerInstanceMilestoneColumn,\n incoming: SQL,\n): SQL<boolean> {\n return sql<boolean>`${incoming} IS NOT NULL AND (${current} IS NULL OR ${incoming} < ${current})`;\n}\n\nfunction firstObservedAt(current: SQL | RunnerInstanceMilestoneColumn, incoming: SQL) {\n return sql`\n CASE\n WHEN ${incoming} IS NULL THEN ${current}\n WHEN ${current} IS NULL THEN ${incoming}\n ELSE least(${current}, ${incoming})\n END\n `;\n}\n\nexport function isTerminalState(state: RunnerInstanceState): boolean {\n return terminalStates.includes(state as (typeof terminalStates)[number]);\n}\n\nfunction isDivergenceCountState(\n state: RunnerInstanceState,\n): state is (typeof divergenceCountStates)[number] {\n return divergenceCountStates.includes(state as (typeof divergenceCountStates)[number]);\n}\n"],"names":["logger","and","asc","desc","eq","exists","gt","inArray","isNotNull","isNull","lt","notExists","notInArray","or","sql","alias","config","sanitizeRunnerLabels","recordRunnerReservationCapacityFailure","db","listRunningJobExecutionsByRunnerInstanceTx","lockRunnerReservationAdvisoryKeysTx","releaseTerminalRunnerInstanceReservationsByIds","validateRunnerReservationCapacityTx","activeStates","terminalStates","ephemeralRegistrationTokens","provisionerTokens","reservations","runnerControlSessions","providerRunners","toRunnerInstance","runnerSessions","runningJobExecutions","divergenceCountStates","attachRunnerInstanceProviderId","params","updated","update","set","providerRunnerId","updatedAt","where","id","runnerInstanceId","provisionerId","state","returning","length","reportRunnerInstances","events","accepted","reservationsReleased","terminateIntentsHonored","transaction","tx","receivedAt","Date","aggregatedEvents","aggregateEvents","hasTerminalEvent","some","event","isTerminalState","execute","workspaceId","hydrateRunnerSessionIdsFromConsumedTokens","reservationSafeEvents","guardReportedReservationIdsTx","existingReportedAtByProviderRunnerId","listExistingProviderRunnerReportedAtTx","Map","freshTerminalEvents","filter","existingReportedAt","get","undefined","reportedAt","listTerminateIntentsHonoredByTerminatedReportsTx","values","map","reservationId","templateKey","labels","scope","logLevel","source","reason","runnerSessionId","providerKind","startedAt","stoppingAt","stoppedAt","failedAt","terminatedAt","insert","onConflictDoUpdate","target","targetWhere","providerRunnerProjectionUpdateCondition","firstObservedAt","setWhere","providerRunnerMilestoneUpdateCondition","releaseTerminalRunnerInstanceReservations","providerRunnerIds","Set","rows","select","from","flatMap","row","reportedReservationIds","sort","existingReservationRows","intendedReservationId","storedReservationIds","reservationIds","existingRows","reservationReleasedAt","for","existingByProviderRunnerId","candidateReservationByProviderRunnerId","existing","validation","requests","count","advisoryLocksHeld","unavailableByReservation","remainingAcceptedByReservation","acceptedByReservation","matchesExistingReservation","remaining","listActiveRunnerInstanceCountsByTemplateTx","groupBy","isDivergenceCountState","countStaleEnrolledRunnerInstances","staleRunnerInstanceCutoff","graceSeconds","closedAt","expiresAt","listProviderRunnerByPhaseMetrics","phase","createdAt","assignedAt","provider","launchKind","oldestAgeMilliseconds","leftJoin","Math","max","listActiveRunnerInstances","windowSeconds","orderBy","limit","listProvisionerTerminateIntents","listProvisionerTerminateIntentRowsTx","provisionerTerminateIntentsQuery","truncated","returnedRows","slice","warn","returnedCount","activationTimeoutRunnerIds","toRunnerInstanceTerminateIntent","activationTimeoutRetry","newerRunningJobExecutions","latestCancelledJob","cancellationRequestedAt","jobExecutionId","activationTimeout","RUNNER_DEMAND_ACTIVATION_TIMEOUT_SECONDS","terminatedRunnerInstanceIds","reconcileRunnerInstances","observedRunnerInstanceIds","absentIds","staleAbsentRows","terminateGraceSeconds","runnerInstanceIds","requireUnlinkedSession","observedRows","boundJobExecutions","boundJobExecutionsByRunnerInstanceId","jobExecution","reapStaleRunnerInstances","cutoff","thresholdSeconds","candidateRows","staleRunnerInstanceWhere","terminalReservationRows","reaped","workspaceIds","updatedRows","group","groupRunnerInstanceIds","terminalEvents","reportedAtByProviderRunnerId","lastSeenAt","groups","key","push","tokenRows","consumedSessionId","consumedAt","consumedSessionIdsByRunnerInstanceId","has","size","byRunnerInstanceId","rawEvent","toRunnerInstanceReportRow","mergeMilestones","compareRunnerInstanceReportEvents","mergeProjectionMetadata","earliestDate","pickMilestones","a","b","timeDelta","getTime","rankDelta","getRunnerInstanceStateRank","providerRunnerStateRank","milestoneNeedsUpdate","current","incoming","includes"],"mappings":"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"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import type { RunnerInstanceState } from '#core/entities/runner-instance.js';
|
|
2
|
+
export declare const activeStates: readonly ["starting", "running", "stopping"];
|
|
3
|
+
export declare const terminalStates: readonly Extract<RunnerInstanceState, 'stopped' | 'failed' | 'terminated'>[];
|
|
2
4
|
//# sourceMappingURL=runner-states.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-states.d.ts","sourceRoot":"","sources":["../../src/db/runner-states.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner-states.d.ts","sourceRoot":"","sources":["../../src/db/runner-states.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAC;AAE3E,eAAO,MAAM,YAAY,8CAI0B,CAAC;AAEpD,eAAO,MAAM,cAAc,EAEtB,SAAS,OAAO,CAAC,mBAAmB,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC"}
|
package/dist/db/runner-states.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
'
|
|
4
|
-
'
|
|
1
|
+
import { providerRunnerStateSchema } from '@shipfox/api-runners-dto';
|
|
2
|
+
export const activeStates = [
|
|
3
|
+
'starting',
|
|
4
|
+
'running',
|
|
5
|
+
'stopping'
|
|
5
6
|
];
|
|
7
|
+
export const terminalStates = providerRunnerStateSchema.options.filter((state)=>!activeStates.includes(state));
|
|
6
8
|
|
|
7
9
|
//# sourceMappingURL=runner-states.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/runner-states.ts"],"sourcesContent":["import type {RunnerInstanceState} from '#core/entities/runner-instance.js';\n\nexport const
|
|
1
|
+
{"version":3,"sources":["../../src/db/runner-states.ts"],"sourcesContent":["import {providerRunnerStateSchema} from '@shipfox/api-runners-dto';\nimport type {RunnerInstanceState} from '#core/entities/runner-instance.js';\n\nexport const activeStates = [\n 'starting',\n 'running',\n 'stopping',\n] as const satisfies readonly RunnerInstanceState[];\n\nexport const terminalStates = providerRunnerStateSchema.options.filter(\n (state) => !activeStates.includes(state as (typeof activeStates)[number]),\n) as readonly Extract<RunnerInstanceState, 'stopped' | 'failed' | 'terminated'>[];\n"],"names":["providerRunnerStateSchema","activeStates","terminalStates","options","filter","state","includes"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,2BAA2B;AAGnE,OAAO,MAAMC,eAAe;IAC1B;IACA;IACA;CACD,CAAmD;AAEpD,OAAO,MAAMC,iBAAiBF,0BAA0BG,OAAO,CAACC,MAAM,CACpE,CAACC,QAAU,CAACJ,aAAaK,QAAQ,CAACD,QAC8C"}
|