From 0cfe8ba8912f52f2d2af8611b083d7906c21e18f Mon Sep 17 00:00:00 2001 From: Echo Date: Tue, 5 May 2026 20:16:26 +0000 Subject: [PATCH] fix: job completion stuck in running - NULL output and status type mismatch Bug 1: status.output.as_deref() passes NULL when agent returns no output, but patch_job_hosts.output has NOT NULL constraint. Fix: use .unwrap_or("") to default to empty string. Bug 2: sync_job_status passes String to job_status enum column, PostgreSQL rejects implicit text-to-enum cast. Fix: add ::job_status cast in SQL UPDATE queries. --- crates/pm-worker/src/job_executor.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/pm-worker/src/job_executor.rs b/crates/pm-worker/src/job_executor.rs index d509912..47a77e8 100644 --- a/crates/pm-worker/src/job_executor.rs +++ b/crates/pm-worker/src/job_executor.rs @@ -690,7 +690,7 @@ async fn poll_single_host(pool: PgPool, config: Arc, row: PatchJobHos "#, ) .bind(row.id) - .bind(status.output.as_deref()) + .bind(status.output.as_deref().unwrap_or("")) .execute(&pool) .await { @@ -906,7 +906,7 @@ async fn sync_job_status(pool: &PgPool, job_id: Uuid) { sqlx::query( r#" UPDATE patch_jobs - SET status = $2, + SET status = $2::job_status, completed_at = COALESCE(completed_at, NOW()) WHERE id = $1 "#, @@ -916,7 +916,7 @@ async fn sync_job_status(pool: &PgPool, job_id: Uuid) { .execute(pool) .await } else { - sqlx::query("UPDATE patch_jobs SET status = $2 WHERE id = $1") + sqlx::query("UPDATE patch_jobs SET status = $2::job_status WHERE id = $1") .bind(job_id) .bind(new_status) .execute(pool)