fix(dedup): recompute任务从file_url派生OSS下载key (Issue #1702连带修复)
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 / PR Build API Image (pull_request) Successful in 35s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 34s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m46s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m56s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m54s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m57s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m21s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m57s
AI Code Review / AI Code Review (pull_request) Successful in 3m42s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 4m20s
CI/CD Pipeline / CI Gate (pull_request) Successful in 3s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m8s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 9s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 18s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 270h48m55s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 270h48m58s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 270h48m55s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 270h53m1s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 270h48m58s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 270h53m6s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 270h53m8s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 270h53m8s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 270h53m11s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 270h53m12s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 270h53m15s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 270h53m17s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 270h53m18s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 270h53m25s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 271h23m27s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 271h27m34s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 271h27m39s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 271h27m43s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 271h27m47s
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 / PR Build API Image (pull_request) Successful in 35s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 34s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m46s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m56s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m54s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m57s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m21s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m57s
AI Code Review / AI Code Review (pull_request) Successful in 3m42s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 4m20s
CI/CD Pipeline / CI Gate (pull_request) Successful in 3s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m8s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 9s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 18s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 270h48m55s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 270h48m58s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 270h48m55s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 270h53m1s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 270h48m58s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 270h53m6s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 270h53m8s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 270h53m8s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 270h53m11s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 270h53m12s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 270h53m15s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 270h53m17s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 270h53m18s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 270h53m25s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 271h23m27s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 271h27m34s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 271h27m39s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 271h27m43s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 271h27m47s
check_duplicate_task(recompute-dedup的执行入口)硬编码下载
projects/{pid}/generated/{vid}/{vid}.mp4,但成片真实OSS key是生成时的
generated/projects/{pid}/tasks/{tid}/rendered_*.mp4(generation.py
_upload_and_record),导致所有recompute任务下载404、查重数据无法重算。
正常生成流程用本地渲染文件算指纹不受影响,仅recompute路径中招。
改为优先从video.file_url解析下载key,旧key模式仅作回退。
补源码级回归单测。
This commit is contained in:
committed by
xiaoxia
parent
28b3010668
commit
46325f55ca
@@ -1216,9 +1216,17 @@ def check_duplicate_task(self: Task, generated_video_id: str) -> dict:
|
||||
raise ValueError(f"Generated video {generated_video_id} not found")
|
||||
|
||||
local_path = os.path.join(temp_dir, f"{generated_video_id}.mp4")
|
||||
storage_service.download_file(
|
||||
f"projects/{video.project_id}/generated/{generated_video_id}/{generated_video_id}.mp4", local_path
|
||||
)
|
||||
# Issue #1702: recompute 走的是 OSS 重新下载路径(正常生成流程用本地渲染文件,
|
||||
# 不经此任务)。成片真实 OSS key 是生成时的
|
||||
# generated/projects/{pid}/tasks/{task_id}/rendered_*.mp4(见 generation.py
|
||||
# _upload_and_record),旧代码硬编码 projects/{pid}/generated/{vid}/{vid}.mp4
|
||||
# 这个从不存在的 key,导致所有 recompute 任务下载 404、查重数据永远无法重算。
|
||||
# 优先从 file_url 解析真实 key,旧 key 模式仅作回退。
|
||||
download_key = getattr(video, "file_url", "") or ""
|
||||
if not download_key:
|
||||
download_key = f"projects/{video.project_id}/generated/{generated_video_id}/{generated_video_id}.mp4"
|
||||
logger.warning("video %s has no file_url, falling back to legacy key %s", generated_video_id, download_key)
|
||||
storage_service.download_file(download_key, local_path)
|
||||
|
||||
fingerprint = deduplicator.compute_fingerprint(local_path)
|
||||
|
||||
|
||||
@@ -359,3 +359,31 @@ class TestZeroMatchLogging:
|
||||
result = _check(ddp, fp, [existing])
|
||||
assert result is None
|
||||
assert any("no match" in r.message for r in caplog.records)
|
||||
|
||||
|
||||
# ── recompute 任务下载路径(#1702 连带修复:旧硬编码 key 404) ─────
|
||||
|
||||
|
||||
class TestRecomputeDownloadPath:
|
||||
"""recompute-dedup 走 check_duplicate_task,需要从 OSS 重新下载成片。
|
||||
|
||||
旧代码硬编码 projects/{pid}/generated/{vid}/{vid}.mp4(从不存在),
|
||||
真实 key 在 file_url:generated/projects/{pid}/tasks/{tid}/rendered_*.mp4。
|
||||
"""
|
||||
|
||||
def test_task_downloads_from_file_url(self):
|
||||
import inspect
|
||||
|
||||
import video_processing.dedup as dedup_mod
|
||||
|
||||
source = inspect.getsource(dedup_mod.check_duplicate_task)
|
||||
# 下载 key 必须来自 video.file_url
|
||||
assert 'getattr(video, "file_url"' in source or "video.file_url" in source
|
||||
# 旧的硬编码 key 只能作为回退存在,不能是主路径
|
||||
assert "falling back to legacy key" in source
|
||||
# download_file 接收的是派生 key 而非硬编码 f-string
|
||||
assert "storage_service.download_file(download_key" in source
|
||||
assert '/generated/{generated_video_id}/{generated_video_id}.mp4"' not in source.replace(
|
||||
'download_key = f"projects/{video.project_id}/generated/{generated_video_id}/{generated_video_id}.mp4"',
|
||||
"",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user