fix(P0+P1): 孤儿任务清理 + 时间时区统一 #535
Reference in New Issue
Block a user
Delete Branch "fix/p1-datetime-utc-timezone"
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?
P0: 孤儿任务清理
worker 启动和任务调度时,自动清理超时未更新的 running 任务。
问题
worker 重启或崩溃后,数据库中 running 状态的任务变成孤儿,一直卡着不动,前端显示进度条卡住。
修复
P1: 时间时区统一
数据库 DateTime 列存 UTC 但不带时区标识,
.isoformat()输出无Z后缀,前端按本地时间解析,显示差 8 小时。修复
format_utc_datetime工具函数,统一输出带Z后缀的 ISO 8601 UTC 时间generated_at:改为带时区的字符串created_at:改为带时区的字符串created_at/updated_at:从 datetime 类型改为带时区字符串new Date()自动转本地时间,无需额外处理🚀 预览环境已部署
fix(P1): 时间字段返回带UTC时区标识,修复前端显示差8小时to fix(P0+P1): 孤儿任务清理 + 时间时区统一代码审查结果 - PR #535
⚠️ 问题(4个需要修改)
packages/adapters/sqlalchemy_impl/generation_task_repository.py 第237行:时区类型不匹配导致运行时错误。
cutoff使用了带时区的datetime.now(timezone.utc),而数据库模型GenerationTaskModel.updated_at的列定义为sa.DateTime(未显式指定timezone=True)。在大多数数据库(如SQLite、MySQL)配置下,从数据库读取出的 datetime 是 naive(无时区)对象。直接比较 naive 和 aware datetime 会抛出TypeError。cutoff改为无时区的 UTC 时间(datetime.utcnow()),或者在模型定义中强制开启时区支持。考虑到迁移成本,建议修改此处逻辑为datetime.utcnow() - timedelta(...)。apps/worker/worker_app/tasks/_startup.py 第36行:数据库连接资源泄漏风险。
session.close()放在了try块中,如果repo.cleanup_stale_running()执行过程中抛出异常,代码会跳过session.close()直接进入except块。try...finally结构确保session.close()必定执行,或使用with SessionLocal() as session:上下文管理器。apps/worker/worker_app/tasks/generation.py 第1412-1420行:冗余的性能开销与异常吞没。
generate_video是核心任务入口,频率极高。在此处调用cleanup_orphan_tasks是不必要的,因为 Worker 启动时(_on_worker_ready)已经执行过清理。此外,使用了裸except Exception: pass吞没了所有错误。generate_video中的清理逻辑,仅保留_on_worker_ready中的调用即可。alembic/versions/043_add_updated_at_to_generation_tasks.py 第22行:数据库默认值时区不一致。
server_default=sa.func.now()使用数据库服务器的本地时间(通常是系统时间),而代码中 Python 层的default使用的是timezone.utc。updated_at将是本地时间,新数据是 UTC 时间,导致时间排序和超时判断逻辑混乱。server_default=sa.text('CURRENT_TIMESTAMP')并确保 DB 时区为 UTC,或者在脚本中显式更新旧数据的时区。💡 建议(2个可选)
apps/api/app/api/routes/_helpers.py 第129行:
format_utc_datetime函数对字符串类型的处理过于宽松。apps/worker/worker_app/tasks/_startup.py:多 Worker 并发清理的竞态考虑。
UPDATE语句。建议加锁或仅由 Leader Worker 执行(如果 Celery 配置支持),不过当前实现影响仅限于性能,属于优化点。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 19:55:34 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #535 已关闭或合并,对应的预览环境已被清理。