fix(worker+api): P1 封面评分时序bug + direct/complete吞ingest占位bug #2092

Merged
auto-approve-bot merged 1 commits from fix/cover-score-timing-and-direct-ingest into develop 2026-09-29 04:24:49 +08:00
Owner

P1 Bug Fixes

Bug1:封面评分时序bug(智能选帧失效+白耗2.6s)

根因:score_frames 在 TemporaryDirectory 退出后执行,帧 jpg 被删,cv2.imread 全失败。
修复:

  • 评分移入 with 块内,帧文件存在时评分;顺序改为 抽帧→标题叠加→评分→按评分顺序并发上传
  • best 帧标 is_best=True,文件名 frame_0.jpg,便于前端直接取
  • MediaKit 路径帧在 NamedTemporaryFile 持久存在,改在 MediaKit 循环内就地评分
  • 评分失败打 warning 保持 seek 顺序,不静默、不阻塞
  • 本地帧由 TemporaryDirectory 自动清理,不再入 _temp_paths

Bug2:/direct/complete 命中 prepare 占位 asset 直接返 duplicated 吞 ingest

根因:_find_duplicate_asset 按 client_upload_id/file_hash 命中 prepare 预建的 PROCESSING 占位后,直接返 duplicated=True、ingest_job_id="",跳过 _submit_ingest_job,素材永久 processing。
修复:

  • IngestJobRepository 新增 find_by_asset_id(port + SQLAlchemy impl + InMemory impl,asset_id 有索引)
  • 新增 _is_true_duplicate(existing, ingest_repo) → (bool, job):
    • READY → 真重复
    • PROCESSING/UPLOADING 且已有在跑/已完成 job → 幂等重试,返已有 job_id
    • PROCESSING/UPLOADING 且无 job → 占位/孤儿,继续补提 ingest
    • ERROR/DELETED → 重新 ingest
  • complete_direct_upload + multipart upload_asset 两处早返统一替换
  • _submit_ingest_job 前加幂等守卫:find_by_asset_id 命中已有 job 直接复用(防竞态重复提交)

Tests

  • thumbnail:+3(帧文件存在性、scorer异常兜底、best排序),共 26 passed
  • upload幂等:+5(占位补ingest、READY真重复、PROCESSING+job幂等、ERROR重入、multipart占位补ingest),共 16 passed

CI 全绿后请 Auto Merge → Watchtower 自动部署 staging。

## P1 Bug Fixes ### Bug1:封面评分时序bug(智能选帧失效+白耗2.6s) 根因:score_frames 在 TemporaryDirectory 退出后执行,帧 jpg 被删,cv2.imread 全失败。 修复: - 评分移入 with 块内,帧文件存在时评分;顺序改为 抽帧→标题叠加→评分→按评分顺序并发上传 - best 帧标 is_best=True,文件名 frame_0.jpg,便于前端直接取 - MediaKit 路径帧在 NamedTemporaryFile 持久存在,改在 MediaKit 循环内就地评分 - 评分失败打 warning 保持 seek 顺序,不静默、不阻塞 - 本地帧由 TemporaryDirectory 自动清理,不再入 _temp_paths ### Bug2:/direct/complete 命中 prepare 占位 asset 直接返 duplicated 吞 ingest 根因:_find_duplicate_asset 按 client_upload_id/file_hash 命中 prepare 预建的 PROCESSING 占位后,直接返 duplicated=True、ingest_job_id="",跳过 _submit_ingest_job,素材永久 processing。 修复: - IngestJobRepository 新增 find_by_asset_id(port + SQLAlchemy impl + InMemory impl,asset_id 有索引) - 新增 _is_true_duplicate(existing, ingest_repo) → (bool, job): - READY → 真重复 - PROCESSING/UPLOADING 且已有在跑/已完成 job → 幂等重试,返已有 job_id - PROCESSING/UPLOADING 且无 job → 占位/孤儿,继续补提 ingest - ERROR/DELETED → 重新 ingest - complete_direct_upload + multipart upload_asset 两处早返统一替换 - _submit_ingest_job 前加幂等守卫:find_by_asset_id 命中已有 job 直接复用(防竞态重复提交) ### Tests - thumbnail:+3(帧文件存在性、scorer异常兜底、best排序),共 26 passed - upload幂等:+5(占位补ingest、READY真重复、PROCESSING+job幂等、ERROR重入、multipart占位补ingest),共 16 passed CI 全绿后请 Auto Merge → Watchtower 自动部署 staging。
xiaoxia added 1 commit 2026-09-29 04:14:00 +08:00
fix(worker+api): P1 封面评分时序bug + direct/complete吞ingest占位bug (#2092)
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
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 / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped 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 / PR Build API Image (pull_request) Successful in 40s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m42s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m31s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m34s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 4m51s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 5m2s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 6m10s
AI Code Review / AI Code Review (pull_request) Successful in 6m39s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 7m24s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 10m4s
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 / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
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
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m26s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 24s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 47s
decbc107fb
Bug1 (P1) 封面评分在 TemporaryDirectory 退出后执行,帧文件已删除:
- score_frames 移入 with TemporaryDirectory 块内,帧文件存在时评分
- 评分在上传之前完成,按评分顺序并发上传,best 帧 is_best=True 标为 frame_0
- MediaKit 路径帧在 NamedTemporaryFile 持久存在,改在 MediaKit 循环内就地评分
- 评分失败打 warning 保持原顺序,不静默、不阻塞上传
- 本地帧 by TemporaryDirectory 自动清理,不再入 _temp_paths 重复 unlink
- 补 3 个单测:帧文件存在性、scorer 异常兜底、best 排序

Bug2 (P1) /direct/complete 命中 prepare 占位 asset 直接返 duplicated 吞 ingest:
- 新增 IngestJobRepository.find_by_asset_id(port + SQLAlchemy + InMemory 实现)
- 新增 _is_true_duplicate 区分真重复 vs 占位:
  - READY → 真重复(返 duplicated)
  - PROCESSING/UPLOADING 且有在跑/已完成 job → 幂等重试返 duplicated + 已有 job_id
  - PROCESSING/UPLOADING 且无 job → 占位/孤儿,继续补提 ingest
  - ERROR/DELETED → 允许重新 ingest
- complete_direct_upload / upload_asset 两处早返逻辑替换为 _is_true_duplicate
- _submit_ingest_job 前加幂等守卫:find_by_asset_id 命中已有 job 直接复用,避免竞态重复提交
- 补 5 个单测覆盖:占位补 ingest、READY 真重复、PROCESSING+已有job幂等、ERROR 重入、multipart 占位补 ingest

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #2092 | | 预览链接 | [https://pr-2092.preview.xiaoxiajianji.com](https://pr-2092.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot merged commit f9f3e6bfb9 into develop 2026-09-29 04:24:49 +08:00
auto-approve-bot deleted branch fix/cover-score-timing-and-direct-ingest 2026-09-29 04:24:52 +08:00

🗑️ 预览环境已清理

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

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

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