fix: 渲染产物临时目录不在render_plan中提前清理,改由调用方上传后清理 #1484

Merged
auto-approve-bot merged 3 commits from fix/temp-dir-cleanup-race into develop 2026-08-24 21:21:00 +08:00
Owner

问题

render_adapter.pyrender_plan 方法在 finally 块中 shutil.rmtree 清理了临时目录,但 generation.py_upload_and_record 还需要访问临时目录中的渲染产物文件进行 OSS 上传,导致 FileNotFoundError

修复

  1. RenderAdapterResult 增加 temp_dir 字段:将临时目录路径传递给调用方
  2. render_plan 成功时不清理:成功路径中将 temp_dir 赋给 result 后置 None,阻止 finally 清理
  3. render_plan 失败时仍清理:异常路径不受影响,finally 正常清理
  4. generation.py 上传后清理:在 _upload_and_record 完成后调用 shutil.rmtree 清理临时目录

改动文件

  • apps/worker/video_processing/render_adapter.py:+7/-1
  • apps/worker/worker_app/tasks/generation.py:+14/-2
  • tests/unit/test_temp_dir_cleanup_race.py:新增 4 个回归测试

验证

  • 4 个新单测通过
  • CI 全绿
## 问题 `render_adapter.py` 的 `render_plan` 方法在 `finally` 块中 `shutil.rmtree` 清理了临时目录,但 `generation.py` 的 `_upload_and_record` 还需要访问临时目录中的渲染产物文件进行 OSS 上传,导致 `FileNotFoundError`。 ## 修复 1. **`RenderAdapterResult` 增加 `temp_dir` 字段**:将临时目录路径传递给调用方 2. **`render_plan` 成功时不清理**:成功路径中将 `temp_dir` 赋给 result 后置 None,阻止 finally 清理 3. **`render_plan` 失败时仍清理**:异常路径不受影响,finally 正常清理 4. **`generation.py` 上传后清理**:在 `_upload_and_record` 完成后调用 `shutil.rmtree` 清理临时目录 ## 改动文件 - `apps/worker/video_processing/render_adapter.py`:+7/-1 - `apps/worker/worker_app/tasks/generation.py`:+14/-2 - `tests/unit/test_temp_dir_cleanup_race.py`:新增 4 个回归测试 ## 验证 - [x] 4 个新单测通过 - [ ] CI 全绿

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1484 | | 预览链接 | [https://pr-1484.preview.xiaoxiajianji.com](https://pr-1484.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-08-24 17:55:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-24 17:55:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 1 commit 2026-08-24 20:46:42 +08:00
fix: 渲染产物临时目录不在render_plan中提前清理,改由调用方上传后清理
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 35s
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 / PR Build Worker Image (pull_request) Successful in 37s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 39s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m39s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m51s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m47s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m51s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m40s
AI Code Review / AI Code Review (pull_request) Successful in 4m15s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 4m22s
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
4295f20fd6
render_plan 的 finally 块在 _do_render 返回后立即清理临时目录,
但 generation.py 的 _upload_and_record 还需要读取其中的 output_path
进行 OSS 上传,导致 FileNotFoundError。

修复方案:
- RenderAdapterResult 增加 temp_dir 字段
- render_plan 成功时将 temp_dir 转移给 result,并设 temp_dir=None
  阻止 finally 清理;失败时 finally 仍正常清理
- _render_from_edit_plan 返回 temp_dir
- generation.py 上传代码包裹在 try/finally 中,finally 清理临时目录
- 新增4个回归测试
xiaoxia force-pushed fix/temp-dir-cleanup-race from dc51d950e3 to 4295f20fd6 2026-08-24 20:46:42 +08:00 Compare
xiaoxia added 1 commit 2026-08-24 20:59:19 +08:00
fix: 将try块上移到render_temp_dir赋值之后,确保异常时也清理临时目录
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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 24s
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 / PR Build API Image (pull_request) Successful in 39s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 44s
AI Code Review / AI Code Review (pull_request) Successful in 1m56s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m1s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m5s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m35s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m36s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m0s
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
6b67bb948b
xiaoxia force-pushed fix/temp-dir-cleanup-race from ed1c5e82ac to 6b67bb948b 2026-08-24 20:59:19 +08:00 Compare
auto-approve-bot added 1 commit 2026-08-24 21:04:21 +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 38s
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 / PR Build Worker Image (pull_request) Successful in 30s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 35s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m44s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m49s
AI Code Review / AI Code Review (pull_request) Successful in 2m22s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m42s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m10s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m24s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 6m47s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 9m6s
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 6m12s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 1m15s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m23s
c9fb83a88c
Collaborator

代码审查结果 - PR #1484

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

💡 建议(2个可选)

  1. apps/worker/worker_app/tasks/generation.py 第730行import shutil 放在 finally 块内部不符合常规的代码组织习惯,虽然 Python 允许这样做,但建议将标准库的导入语句统一放在文件顶部,以提高代码可读性和加载效率。
  2. tests/unit/test_temp_dir_cleanup_race.py 第40行、第47行:测试用例使用字符串匹配(如 assert "temp_dir = None" in source)来验证逻辑,这种方式较为脆弱,容易因代码格式化(如去除空格)而失败。建议使用 AST(抽象语法树)遍历来精确检查赋值逻辑,类似于 test_render_adapter_result_has_temp_dir_field 中的实现方式。

格式检查通过 | 逻辑审查通过 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-08-24 13:06:41 | 模型:

## 代码审查结果 - PR #1484 ### ⚠️ 问题(0个需要修改) 无 ### 💡 建议(2个可选) 1. **apps/worker/worker_app/tasks/generation.py 第730行**:`import shutil` 放在 `finally` 块内部不符合常规的代码组织习惯,虽然 Python 允许这样做,但建议将标准库的导入语句统一放在文件顶部,以提高代码可读性和加载效率。 2. **tests/unit/test_temp_dir_cleanup_race.py 第40行、第47行**:测试用例使用字符串匹配(如 `assert "temp_dir = None" in source`)来验证逻辑,这种方式较为脆弱,容易因代码格式化(如去除空格)而失败。建议使用 AST(抽象语法树)遍历来精确检查赋值逻辑,类似于 `test_render_adapter_result_has_temp_dir_field` 中的实现方式。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-24 13:06:41 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot merged commit 3af65c2743 into develop 2026-08-24 21:21:00 +08:00
auto-approve-bot deleted branch fix/temp-dir-cleanup-race 2026-08-24 21:21:01 +08:00

🗑️ 预览环境已清理

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

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

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