fix(worker): P1 修复任务状态覆盖 + 封面metadata属性名错误 #1471

Merged
auto-approve-bot merged 2 commits from fix/p1-task-status-cover-metadata into develop 2026-08-23 19:11:01 +08:00
Owner

P1 紧急修复

Bug 1: 任务状态被过期内存对象覆盖回 pending

gen_task 在任务开头加载(status=pending),中间 _update_task_status 用独立 session 把 DB 改成 running,但内存对象仍为 pending。保存 asset_analyses 时 _repo.update(gen_task) 整体写回,把 status 覆盖回 pending → mark_completed 报非法状态转换 pending→completed。

修复:独立 session 查询最新模型,只更新 extra_meta 字段,删除 _repo.update(gen_task)。

Bug 2: 封面候选帧误用 SQLAlchemy 保留属性 .metadata

GenerationTaskModel 的 ORM 属性名是 extra_meta(DB 列名为 metadata)。代码两处写 _cover_model.metadata 实际赋值给 SQLAlchemy 声明基类保留的 MetaData 对象,持久化完全无效,封面候选帧丢失。

修复:两处 .metadata 全部改为 .extra_meta。

测试

  • 新增 tests/unit/test_worker_cover_meta_and_status.py(5 个测试)
  • 容器内 8 个相关单测全部通过
  • Python 语法 + runtime import + task 签名验证通过
## P1 紧急修复 ### Bug 1: 任务状态被过期内存对象覆盖回 pending gen_task 在任务开头加载(status=pending),中间 _update_task_status 用独立 session 把 DB 改成 running,但内存对象仍为 pending。保存 asset_analyses 时 _repo.update(gen_task) 整体写回,把 status 覆盖回 pending → mark_completed 报非法状态转换 pending→completed。 修复:独立 session 查询最新模型,只更新 extra_meta 字段,删除 _repo.update(gen_task)。 ### Bug 2: 封面候选帧误用 SQLAlchemy 保留属性 .metadata GenerationTaskModel 的 ORM 属性名是 extra_meta(DB 列名为 metadata)。代码两处写 _cover_model.metadata 实际赋值给 SQLAlchemy 声明基类保留的 MetaData 对象,持久化完全无效,封面候选帧丢失。 修复:两处 .metadata 全部改为 .extra_meta。 ### 测试 - 新增 tests/unit/test_worker_cover_meta_and_status.py(5 个测试) - 容器内 8 个相关单测全部通过 - Python 语法 + runtime import + task 签名验证通过
xiaoxia added 1 commit 2026-08-23 18:56:30 +08:00
fix(worker): P1 修复任务状态被过期对象覆盖回pending + 封面metadata属性名错误
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 46s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m21s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 46s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 48s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m39s
AI Code Review / AI Code Review (pull_request) Successful in 1m40s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m41s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m20s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
084c0494b7
Bug1: asset_analyses 持久化时使用任务开头加载的 gen_task 内存对象
(status=pending) 整体 _repo.update(),把已被 _update_task_status 改为
running 的 DB status 覆盖回 pending,导致 mark_completed 报非法状态转换。
改为独立 session 查询最新模型,只更新 extra_meta 字段。

Bug2: 封面候选帧持久化使用 _cover_model.metadata(SQLAlchemy 声明基类
保留的 MetaData 对象),赋值无效;ORM 属性名应为 extra_meta(DB列名
为 metadata)。两处全部修正。

新增 5 个防回归单测覆盖两个 Bug。

🚀 预览环境已部署

项目 详情
PR号 #1471
预览链接 https://pr-1471.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1471 | | 预览链接 | [https://pr-1471.preview.xiaoxiajianji.com](https://pr-1471.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-23 18:59:16 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 36s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 42s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m31s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m39s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m41s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 31s
AI Code Review / AI Code Review (pull_request) Successful in 2m2s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m22s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m49s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m43s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m21s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m42s
CI/CD Pipeline / CI Gate (pull_request) Successful in 7s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m4s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 1m5s
0ecf27a8d0
Collaborator

代码审查结果 - PR #1471

⚠️ 问题(0个需要修改)

(无)

💡 建议(2个可选)

  1. apps/worker/worker_app/tasks/generation.py 第1686行:变量 _m 命名含义不明确,建议重命名为 task_modeldb_task 以提高代码可读性。
  2. apps/worker/worker_app/tasks/generation.py 第1683-1685行:建议确认将 GenerationTaskModel 的 import 放在函数内部是否为了规避循环依赖。如果没有循环依赖问题,建议移至文件顶部统一管理,以减少函数调用时的开销。

格式检查通过 | 逻辑审查通过 | 性能无隐患

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:2 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [apps/worker/worker_app/tasks/generation.py:1686] 变量命名可读性

    • 具体内容:代码中使用 _m 作为查询出的模型对象变量名,语义不明。建议改为更具描述性的名称,如 current_tasktask_model,以便后续维护者快速理解其用途。
  2. [apps/worker/worker_app/tasks/generation.py:1683-1685] Import 位置优化

    • 具体内容:GenerationTaskModel 的导入语句位于函数内部。虽然这可以解决某些循环依赖问题,但会增加每次函数调用的开销。如果并非必须放在此处,建议移至模块顶部。

良好实践

  1. 修复数据陈旧问题:通过创建独立的 DB Session (_meta_session) 重新查询并更新 extra_meta,有效避免了使用内存中过期的 gen_task 对象覆盖数据库最新状态(如 status)的严重 Bug。
  2. 修复属性误用:将 _cover_model.metadata 修正为 _cover_model.extra_meta,正确区分了 SQLAlchemy 保留属性与业务自定义字段,防止了潜在的数据写入错误。
  3. 资源管理规范:新增的 DB Session 操作使用了 try...finally 结构确保 session 正确关闭,避免了连接泄漏风险。
  4. 完善的回归测试:新增的单元测试针对性强,覆盖了“属性误用”和“陈旧对象更新”两个核心修复点,有效防止问题回退。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-23 11:01:17 | 模型:

## 代码审查结果 - PR #1471 ### ⚠️ 问题(0个需要修改) (无) ### 💡 建议(2个可选) 1. **apps/worker/worker_app/tasks/generation.py 第1686行**:变量 `_m` 命名含义不明确,建议重命名为 `task_model` 或 `db_task` 以提高代码可读性。 2. **apps/worker/worker_app/tasks/generation.py 第1683-1685行**:建议确认将 `GenerationTaskModel` 的 import 放在函数内部是否为了规避循环依赖。如果没有循环依赖问题,建议移至文件顶部统一管理,以减少函数调用时的开销。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能无隐患 ### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/worker/worker_app/tasks/generation.py:1686] 变量命名可读性** - 具体内容:代码中使用 `_m` 作为查询出的模型对象变量名,语义不明。建议改为更具描述性的名称,如 `current_task` 或 `task_model`,以便后续维护者快速理解其用途。 2. **[apps/worker/worker_app/tasks/generation.py:1683-1685] Import 位置优化** - 具体内容:`GenerationTaskModel` 的导入语句位于函数内部。虽然这可以解决某些循环依赖问题,但会增加每次函数调用的开销。如果并非必须放在此处,建议移至模块顶部。 ### ✅ 良好实践 1. **修复数据陈旧问题**:通过创建独立的 DB Session (`_meta_session`) 重新查询并更新 `extra_meta`,有效避免了使用内存中过期的 `gen_task` 对象覆盖数据库最新状态(如 status)的严重 Bug。 2. **修复属性误用**:将 `_cover_model.metadata` 修正为 `_cover_model.extra_meta`,正确区分了 SQLAlchemy 保留属性与业务自定义字段,防止了潜在的数据写入错误。 3. **资源管理规范**:新增的 DB Session 操作使用了 `try...finally` 结构确保 session 正确关闭,避免了连接泄漏风险。 4. **完善的回归测试**:新增的单元测试针对性强,覆盖了“属性误用”和“陈旧对象更新”两个核心修复点,有效防止问题回退。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-23 11:01:17 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-23 19:05:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-23 19:05:31 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 9fd1246c6b into develop 2026-08-23 19:11:01 +08:00
auto-approve-bot deleted branch fix/p1-task-status-cover-metadata 2026-08-23 19:11:02 +08:00

🗑️ 预览环境已清理

PR #1471 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1471 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.