fix: 批量任务残留PENDING仍误标COMPLETED——置完成前校验无残留+崩溃恢复批量任务
事故(batch_969fabe74b83 等 3 个任务实测):批量引擎串行处理到 9.9GB 大视频时中断,_run_job 无条件收尾把任务置 COMPLETED,留下"N 个 PENDING 待处理却已完成"的僵尸状态——3 个任务遗留的 PENDING 完全相同(kiwvr-887/ mdvr-413/savr-1077 共 10 个大视频),且均卡在大文件前从未被真正处理。 - batch.py: _run_job 置 COMPLETED 前校验全部非 SKIPPED 视频已结束 (无 PENDING/PAUSED 残留),否则保持 RUNNING 交引擎下一轮续跑 - db.py/main.py: 新增 recover_interrupted_batch_jobs,重启时把 RUNNING 批量任务恢复 QUEUED(否则停在 RUNNING 永远不会被再次拾起) - tests: 新增 2 条 TDD 回归(残留 PENDING 不置 COMPLETED、批量崩溃恢复) - scripts/fix_zombie_batch_jobs.py: 历史僵尸数据修复脚本(置回 QUEUED 续跑) - AGENTS.md: 补充完成任务判定与崩溃恢复约定
This commit is contained in:
@@ -385,6 +385,24 @@ class Database:
|
||||
)
|
||||
return cur.rowcount
|
||||
|
||||
def recover_interrupted_batch_jobs(self, updated_at: str) -> int:
|
||||
"""重启恢复:把遗留 RUNNING 的批量任务恢复为 QUEUED,返回恢复数量。
|
||||
|
||||
批量引擎处理视频(尤其大文件)时进程被杀/重启,批量任务会停在
|
||||
RUNNING:其关联 run 由 recover_interrupted_runs 恢复为 QUEUED,但
|
||||
批量任务本身若保持 RUNNING,next_queued_batch_job 只拾取 QUEUED,
|
||||
永远不会重新驱动它 → 未处理完的 PENDING 视频永久残留
|
||||
(batch_969fabe74b83 事故链路之一)。恢复为 QUEUED 后引擎重新拾起,
|
||||
从断点(剩余 PENDING 视频 + 已恢复的 run)继续处理。用户主动暂停的
|
||||
PAUSED 批量任务保持不变,等待显式 resume。
|
||||
"""
|
||||
with self._connect() as conn:
|
||||
cur = conn.execute(
|
||||
"UPDATE batch_jobs SET status = 'QUEUED', updated_at = ? WHERE status = 'RUNNING'",
|
||||
(updated_at,),
|
||||
)
|
||||
return cur.rowcount
|
||||
|
||||
def pause_run(self, run_id: str, updated_at: str) -> None:
|
||||
"""暂停任务:置为 PAUSED;调度器会在节点边界检查并停止推进。"""
|
||||
with self._connect() as conn:
|
||||
|
||||
Reference in New Issue
Block a user