fix(worker): Worker 异常时将占位 Asset 标记为 ERROR #1651
Reference in New Issue
Block a user
Delete Branch "fix/worker-asset-error-status"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
ingest_assetWorker 任务的 except 块原来只更新 job status 为 FAILED,没有处理上传时预先创建的 PROCESSING 状态 Asset。如果 Worker 在处理过程中崩溃(ffmpeg 失败、OSS 超时等),Asset 会永远卡在 PROCESSING 状态,前端一直显示"处理中"。
修复
在 except 块中查找对应 storage_key 的 Asset,如果仍处于 PROCESSING 或 UPLOADING 状态,将其标记为 ERROR 并记录错误信息到 metadata。
关键设计
ingest_error字段,便于前端/诊断页展示错误原因关于 Bug A(TTS 保存不同步到 Assets 表)
经代码审查,
save_tts_job_to_library()已经在创建 Asset 记录:mime_type=audio/mpeg(或其他音频格式)duration=job.durationstatus=AssetStatus.READYGET /assets?kind=voice按file_type==audio过滤,可以查到这些记录。Bug A 实际上已经在现有代码中实现了。【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/worker/worker_app/tasks/ingest.py: 735]
job.storage_key缺失空值检查导致 Job 状态更新失败job.storage_key调用find_by_storage_key。如果job.storage_key为None(例如作业创建不完整或数据异常),将抛出异常。该异常会被外层的except Exception捕获(第 756 行),导致db.rollback()被调用,进而导致job_repo.update(job)的修改(标记为 FAILED)无法提交。结果是任务失败,但 Job 状态未更新,系统认为任务仍在运行。find_by_storage_key之前,必须判断job.storage_key是否存在。例如:[apps/worker/worker_app/tasks/ingest.py: 743-746] 异常捕获后继续 Commit 存在 Session 状态损坏风险
asset_repo.update(existing)内部发生数据库错误(如字段超长、约束冲突等),Session 会进入“错误状态”。代码在捕获异常后直接调用db.commit(),极大概率再次抛出InvalidRequestError(This Session is in an error state),导致 Job 的状态更新也无法提交。这违背了“尽力更新 Job 状态”的容错初衷。db.begin_nested()包裹 Asset 更新逻辑,或者在捕获异常后不继续执行当前的commit,而是单独处理 Job 的提交。💡 改进建议(不阻塞合并)
datetime.now(timezone.utc)。虽然差异极小,但在同一个逻辑上下文中,建议提取为变量now = datetime.now(timezone.utc)并复用,确保时间戳的一致性并提升代码整洁度。✅ 良好实践
{**(existing.metadata or {}), ...}安全地更新 metadata,避免了 None 类型错误。🤖 由 AI 代码审查机器人自动生成 | 2026-09-03 09:06:46 | 模型:
🚀 预览环境已部署
🗑️ 预览环境已清理
PR #1651 已关闭或合并,对应的预览环境已被清理。