fix(upload): complete 接口幂等去重 + HEVC 转码回写占位 asset 禁止兜底新建 (#1714) #1715
Reference in New Issue
Block a user
Delete Branch "feature/upload-complete-idempotency-hevc-orphan-1714"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
Issue #1714(诊断见项目文件
asset_duplicate_upload_rootcause_20260905.md):同一文件被反复走完整上传链路(prepare→OSS直传→complete),13 个素材建 69 条记录;HEVC .MOV 转码后占位 PROCESSING 永久卡住。本 PR 为后端部分(前端入队去重/超时处理由前端工程师负责)。
P0:complete 接口幂等
_find_duplicate_asset):client_upload_id(客户端幂等 token,同一次上传重试保持一致)file_hash(内容哈希)client_upload_id,重复提交直接返回、不再传 OSSgetattr鸭子类型调用,旧仓储/旧 mock 零破坏P1:HEVC 转码孤儿 PROCESSING 修复
ingest_jobs.asset_id新列)job.asset_id→ 原始 storage_key → 当前 key;不再用转码改写后的*_h264新 key 回查占位(旧逻辑必然落空 → 兜底新建 READY,原 PROCESSING 占位永久卡住,每个 HEVC 视频产生两条记录)*_h264(播放/下载走转码产物),原始 key 记入metadata.original_storage_key/hevc_transcoded可溯源_h264key 还原原始 key 多路径查找job_repo.update同步 storage_key(转码改写后 DB 一致)迁移
alembic
066_upload_idempotency:assets.client_upload_id(+索引)、ingest_jobs.asset_id(NOT NULL server_default '',+索引)测试
新增 14 个单测:
test_upload_complete_idempotency_1714.py(8 个):同 token/hash 重复 complete 只建 1 条 asset+1 个 job、无 hash/token 近期同名兜底、READY 历史不兜底、窗口过期不兜底、旧仓储鸭子类型降级、OSS 已缺失仍幂等返回、multipart 重复提交不重复传 OSStest_ingest_hevc_orphan_1714.py(6 个):转码成功占位原地 READY 且不产生重复 READY、job.asset_id 关联、无占位兜底新建兼容、非 HEVC 占位更新、无效媒体占位标 ERROR 不新建、异常路径占位标 ERROR全量 14281 passed(仅 5 个已知 h2.config TTS 环境失败,与本改动无关);black/isort/ruff 通过;
scripts/ci/validate_mypy.sh通过;迁移 upgrade/downgrade DDL 本地验证通过。前端对接说明
client_upload_id(建议用入队时生成的稳定文件指纹/上传 id,重试必须复用同一个)和file_size;prepare 已有的file_hash建议在 complete 也带上duplicated=true+ 已有asset_id,前端按成功处理即可,无需重传🚀 预览环境已部署
🗑️ 预览环境已清理
PR #1715 已关闭或合并,对应的预览环境已被清理。