fix: all_completed now checks ALL expected processors have results

Bug: all_completed only checked existing results, not missing processors.
If a processor (like pose) never created a result row, all_completed would
still return true and mark the job as completed.

Fix: all_completed now checks that every processor in job_processors has
a corresponding completed result. Added logging for missing processors.

Also fixed:
- any_pending now checks all expected processors, not just existing results
- Added missing_processors detection and logging
This commit is contained in:
Accusys
2026-07-04 22:09:38 +08:00
parent 4e8c0ea5b9
commit 96e13e40cb

View File

@@ -1304,20 +1304,36 @@ impl JobWorker {
}) })
}); });
let all_completed = results let all_completed = job_processors.iter().all(|p| {
.iter() results.iter().any(|r| {
.filter(|r| job_processors.contains(&r.processor_type.as_str().to_string())) r.processor_type.as_str() == p
.all(|r| matches!(r.status, crate::core::db::ProcessorJobStatus::Completed)); && matches!(r.status, crate::core::db::ProcessorJobStatus::Completed)
})
});
let any_failed = results let any_failed = results
.iter() .iter()
.filter(|r| job_processors.contains(&r.processor_type.as_str().to_string())) .filter(|r| job_processors.contains(&r.processor_type.as_str().to_string()))
.any(|r| matches!(r.status, crate::core::db::ProcessorJobStatus::Failed)); .any(|r| matches!(r.status, crate::core::db::ProcessorJobStatus::Failed));
let any_pending = results let any_pending = job_processors.iter().any(|p| {
.iter() results.iter().any(|r| {
.filter(|r| job_processors.contains(&r.processor_type.as_str().to_string())) r.processor_type.as_str() == p
.any(|r| matches!(r.status, crate::core::db::ProcessorJobStatus::Pending)); && matches!(r.status, crate::core::db::ProcessorJobStatus::Pending)
})
});
// Check for missing processors (in job_processors but not in results)
let missing_processors: Vec<String> = job_processors.iter().filter(|p| {
!results.iter().any(|r| r.processor_type.as_str() == *p)
}).cloned().collect();
if !missing_processors.is_empty() {
info!(
"check_and_complete_job: {} missing processor results: {:?}",
uuid, missing_processors
);
}
const MAX_RETRIES: i32 = 3; const MAX_RETRIES: i32 = 3;