fix: recover orphaned code queue runs

This commit is contained in:
Codex
2026-05-17 10:42:51 +00:00
parent 3a6b3ef33c
commit e5749c426f
8 changed files with 64 additions and 22 deletions
@@ -14,6 +14,10 @@ interface RuntimeConfig {
port: number;
databaseUrl: string;
logFile: string;
deployServiceId: string;
deployRepo: string;
deployCommit: string;
deployRequestedCommit: string;
mgrDatabasePoolMax: number;
traceDatabasePoolMax: number;
defaultProviderId: string;
@@ -284,6 +288,10 @@ function configFromEnv(): RuntimeConfig {
port: envNumber("PORT", 4278),
databaseUrl,
logFile: envString("LOG_FILE", "/var/log/unidesk/code-queue-mgr.jsonl"),
deployServiceId: envString("UNIDESK_CODE_QUEUE_MGR_DEPLOY_SERVICE_ID", "code-queue-mgr"),
deployRepo: envString("UNIDESK_CODE_QUEUE_MGR_DEPLOY_REPO", ""),
deployCommit: envString("UNIDESK_CODE_QUEUE_MGR_DEPLOY_COMMIT", ""),
deployRequestedCommit: envString("UNIDESK_CODE_QUEUE_MGR_DEPLOY_REQUESTED_COMMIT", ""),
mgrDatabasePoolMax: Math.max(1, Math.min(2, envNumber("CODE_QUEUE_MGR_DATABASE_POOL_MAX", 2))),
traceDatabasePoolMax: Math.max(1, Math.min(2, envNumber("CODE_QUEUE_TRACE_DATABASE_POOL_MAX", 1))),
defaultProviderId: envString("CODE_QUEUE_MAIN_PROVIDER_ID", "D601"),
@@ -1240,26 +1248,27 @@ async function queueSummary(tasks?: QueueTask[], queueRecords?: QueueRecord[]):
counts[task.status] = Number(counts[task.status] ?? 0) + 1;
summary.counts = counts;
if (terminalTaskUnread(task)) summary.unreadTerminal = Number(summary.unreadTerminal) + 1;
if ((task.status === "running" || task.status === "judging") && summary.activeTaskId === null) summary.activeTaskId = task.id;
if ((task.status === "queued" || task.status === "retry_wait") && summary.runnableTaskId === null) summary.runnableTaskId = task.id;
}
const counts = taskRows.reduce<Record<string, number>>((memo, task) => {
memo[task.status] = (memo[task.status] ?? 0) + 1;
return memo;
}, {});
const activeTaskIds = taskRows.filter((task) => task.status === "running" || task.status === "judging").map((task) => task.id).sort();
const orphanedActiveTaskIds = taskRows.filter((task) => task.status === "running" || task.status === "judging").map((task) => task.id).sort();
const queueList = Array.from(summaries.values()).sort((left, right) => String(left.id).localeCompare(String(right.id)));
return {
total: taskRows.length,
defaultQueueId: config.defaultQueueId,
queueCount: queueList.length,
queues: queueList,
activeQueueIds: queueList.filter((queue) => typeof queue.activeTaskId === "string").map((queue) => String(queue.id)),
activeQueueIds: [],
processingQueueIds: [],
activeRunSlotCount: activeTaskIds.length,
activeRunSlotCount: 0,
activeRunSlotWaiters: [],
activeTaskIds,
activeTaskId: activeTaskIds[0] ?? null,
activeTaskIds: [],
activeTaskId: null,
orphanedActiveTaskIds,
orphanedActiveTaskCount: orphanedActiveTaskIds.length,
processing: false,
counts,
unreadTerminal: taskRows.reduce((total, task) => total + (terminalTaskUnread(task) ? 1 : 0), 0),
@@ -2059,6 +2068,12 @@ async function route(req: Request): Promise<Response> {
ok: schemaReady,
service: "code-queue-mgr",
role: "master-control-plane",
deploy: {
serviceId: config.deployServiceId,
repo: config.deployRepo,
commit: config.deployCommit,
requestedCommit: config.deployRequestedCommit,
},
startedAt: serviceStartedAt,
schemaReady,
schemaLastError,