fix(worker): ingest先下载OSS文件再提取元数据,修复有效性校验全部误判ERROR #489

Merged
auto-approve-bot merged 1 commits from fix/ingest-download-first into develop 2026-07-18 00:25:13 +08:00
Owner

根因:#488新增的有效性校验直接把storage_key传给ffprobe/Pillow,
但storage_key是OSS内部路径不是可访问的URL,元数据提取永远失败。

修复:

  • ingest_asset先调用download_asset下载到临时文件
  • 对本地文件跑ffprobe/Pillow提取元数据
  • 用完删除临时文件
  • 下载失败也标记为ERROR(素材本身不可用)

新增2个测试:下载失败场景 + 临时文件清理验证

Pull Request

变更类型

  • 新功能
  • Bug 修复
  • 文档更新
  • 重构
  • 性能优化
  • 测试
  • 其他

变更说明

相关 Issue

Closes #

测试

  • 添加了新的单元测试
  • 添加了新的集成测试
  • 所有现有测试通过
  • 手动测试通过

检查清单

  • 代码遵循项目代码规范
  • 更新了相关文档
  • 没有引入新的警告
  • 测试覆盖率没有下降
  • 提交信息遵循规范

截图(如适用)

额外信息

根因:#488新增的有效性校验直接把storage_key传给ffprobe/Pillow, 但storage_key是OSS内部路径不是可访问的URL,元数据提取永远失败。 修复: - ingest_asset先调用download_asset下载到临时文件 - 对本地文件跑ffprobe/Pillow提取元数据 - 用完删除临时文件 - 下载失败也标记为ERROR(素材本身不可用) 新增2个测试:下载失败场景 + 临时文件清理验证 ## Pull Request ### 变更类型 - [ ] 新功能 - [ ] Bug 修复 - [ ] 文档更新 - [ ] 重构 - [ ] 性能优化 - [ ] 测试 - [ ] 其他 ### 变更说明 <!-- 简要描述此 PR 的目的 --> ### 相关 Issue <!-- 如果有的话,关联相关的 Issue --> Closes # ### 测试 - [ ] 添加了新的单元测试 - [ ] 添加了新的集成测试 - [ ] 所有现有测试通过 - [ ] 手动测试通过 ### 检查清单 - [ ] 代码遵循项目代码规范 - [ ] 更新了相关文档 - [ ] 没有引入新的警告 - [ ] 测试覆盖率没有下降 - [ ] 提交信息遵循规范 ### 截图(如适用) <!-- 添加相关截图 --> ### 额外信息 <!-- 其他需要说明的信息 -->
xiaoxia added 1 commit 2026-07-18 00:20:14 +08:00
fix(worker): ingest先下载OSS文件再提取元数据,修复有效性校验全部误判ERROR
CI Build & Deploy Pipeline / Build Staging API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 19s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 25s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 49s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 3m7s
Auto Approve CI PRs / Auto Approve on CI Green (pull_request) Successful in 3m38s
AI Code Review / AI Code Review (pull_request) Successful in 3m55s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m27s
Auto Merge CI PRs / Auto Merge on CI Green + Approved (pull_request) Successful in 4m59s
02bc1129b3
根因:#488新增的有效性校验直接把storage_key传给ffprobe/Pillow,
但storage_key是OSS内部路径不是可访问的URL,元数据提取永远失败。

修复:
- ingest_asset先调用download_asset下载到临时文件
- 对本地文件跑ffprobe/Pillow提取元数据
- 用完删除临时文件
- 下载失败也标记为ERROR(素材本身不可用)

新增2个测试:下载失败场景 + 临时文件清理验证
auto-approve-bot approved these changes 2026-07-18 00:23:51 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
Collaborator

代码审查结果 - PR #489

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

  1. apps/worker/worker_app/tasks/ingest.py 第247行:异常处理被静默吞没,存在资源泄漏风险。
    • finally 块中清理临时文件时,except OSError: pass 会忽略所有删除失败的错误(如权限不足、文件被占用等)。在长时间运行的 Worker 进程中,这可能导致临时文件堆积,耗尽磁盘空间,且难以排查。建议至少记录 Warning 级别日志。

💡 建议(1个可选)

  1. apps/worker/worker_app/tasks/ingest.py 第238行:参数类型一致性建议。
    • 代码中 download_asset 接收的是 Path 对象,而 extract_media_metadata 接收的是 str(local_file)。如果 download_asset 的实现依赖字符串操作(如拼接路径)或未完全适配 pathlib,可能会引发意外错误。建议统一转换为字符串传入,即 download_asset(job.storage_key, str(local_file)),以提高健壮性。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 00:24:10 | 模型:

## 代码审查结果 - PR #489 ### ⚠️ 问题(1个需要修改) 1. **apps/worker/worker_app/tasks/ingest.py 第247行**:异常处理被静默吞没,存在资源泄漏风险。 - 在 `finally` 块中清理临时文件时,`except OSError: pass` 会忽略所有删除失败的错误(如权限不足、文件被占用等)。在长时间运行的 Worker 进程中,这可能导致临时文件堆积,耗尽磁盘空间,且难以排查。建议至少记录 Warning 级别日志。 ### 💡 建议(1个可选) 1. **apps/worker/worker_app/tasks/ingest.py 第238行**:参数类型一致性建议。 - 代码中 `download_asset` 接收的是 `Path` 对象,而 `extract_media_metadata` 接收的是 `str(local_file)`。如果 `download_asset` 的实现依赖字符串操作(如拼接路径)或未完全适配 `pathlib`,可能会引发意外错误。建议统一转换为字符串传入,即 `download_asset(job.storage_key, str(local_file))`,以提高健壮性。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 00:24:10 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot merged commit d25c7e4a75 into develop 2026-07-18 00:25:13 +08:00
auto-approve-bot deleted branch fix/ingest-download-first 2026-07-18 00:25:13 +08:00
Sign in to join this conversation.