fix: 批量任务明细写完再排队(CREATING 状态)

`create_job` 先把任务行以 QUEUED 入库(引擎立刻可见),再逐条登记明细(扫描
媒体库时 500+ 条要数秒);引擎轮询到的快照可能还没包含剩余明细,收尾时"无未结束
明细"检查也看不到它们,于是把任务误标 COMPLETED,剩余视频永远不再被处理。

- 任务行改以 `CREATING` 入库,明细全部登记完才置 QUEUED(引擎只取 QUEUED,
  看不到半成品);登记中途异常置 FAILED 并把异常交给路由层。
- 启动时把上一进程遗留的 CREATING 统一置 FAILED(`fail_creating_batch_jobs`),
  避免明细写一半被热重载/强杀后留下看不见的残留任务。
- 回归测试:明细每写一条就问一次引擎队列(写入过程中取不到任务);中途失败记
  FAILED;启动清理遗留 CREATING。
This commit is contained in:
2026-09-18 22:23:39 +08:00
parent 3f4478523e
commit 7a2dee9b64
5 changed files with 159 additions and 24 deletions
+14
View File
@@ -590,6 +590,20 @@ class Database:
conn.execute(f"UPDATE batch_jobs SET {assignments} WHERE id = ?", values)
def fail_creating_batch_jobs(self, reason: str) -> int:
"""把停留在 CREATING 的批量任务置 FAILED,返回处理条数。
CREATING 只存在于 create_job 逐条登记明细期间;进程被杀或热重载后没有任何
线程会推进它(引擎只取 QUEUED),启动时统一收尾成可见的失败记录。
"""
with self._connect() as conn:
cursor = conn.execute(
"UPDATE batch_jobs SET status = 'FAILED', error = ?, updated_at = ? "
"WHERE status = 'CREATING'",
(reason, _now_iso()),
)
return int(cursor.rowcount or 0)
def sync_batch_job_progress(self, job_id: str) -> None:
"""按视频明细实时对齐任务的 total/done/failed 汇总并落库。