Private
Public Access
1
0

fix: handle agent completed/cancelled statuses in job executor
Some checks failed
CI Pipeline / Rust Format Check (push) Failing after 10m23s
CI Pipeline / Clippy Lints (push) Successful in 1m22s
CI Pipeline / Rust Unit Tests (push) Successful in 1m2s
CI Pipeline / Security Audit (push) Successful in 4s
CI Pipeline / Frontend Lint & Type Check (push) Successful in 12s
CI Pipeline / Build .deb & Release (push) Has been skipped

The linux_patch_api agent returns "completed" as its terminal success
status, but the worker only recognized "succeeded". This caused the
worker to log "unexpected agent status — ignoring" every 60 seconds
and never mark patch jobs as finished.

Changes:
- job_executor.rs: match "completed" alongside "succeeded" as terminal
  success status, mapping both to patch_job_hosts.status = succeeded
- job_executor.rs: match "cancelled" as a terminal failure status,
  routing to handle_host_failure with appropriate error message
- pm-agent-client types.rs: updated AgentJobStatus doc comment to
  list all valid agent statuses: queued, running, succeeded, completed,
  failed, cancelled
This commit is contained in:
2026-04-30 00:53:12 +00:00
parent d843f9ff12
commit ec88a52be2
2 changed files with 9 additions and 2 deletions

View File

@ -184,7 +184,7 @@ pub struct ApplyPatchesResponse {
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct AgentJobStatus {
pub job_id: String,
/// Current status: `"running"`, `"succeeded"`, `"failed"`, or `"cancelled"`.
/// Current status: `"queued"`, `"running"`, `"succeeded"`, `"completed"`, `"failed"`, or `"cancelled"`.
pub status: String,
pub progress_percent: Option<u8>,
pub output: Option<String>,

View File

@ -552,7 +552,7 @@ async fn poll_single_host(pool: PgPool, config: Arc<AppConfig>, row: PatchJobHos
};
match status.status.as_str() {
"succeeded" => {
"succeeded" | "completed" => {
tracing::info!(pjh_id = %row.id, "poll_single_host: agent job succeeded");
if let Err(e) = sqlx::query(
r#"
@ -587,6 +587,13 @@ async fn poll_single_host(pool: PgPool, config: Arc<AppConfig>, row: PatchJobHos
"poll_single_host: job still in progress"
);
},
"cancelled" => {
tracing::info!(pjh_id = %row.id, "poll_single_host: agent job cancelled");
let err_msg = status
.error
.unwrap_or_else(|| "Agent job was cancelled".to_string());
handle_host_failure(pool, row.id, err_msg).await;
},
other => {
tracing::warn!(
pjh_id = %row.id,