fix(upload): complete 接口幂等去重 + HEVC 转码回写占位 asset 禁止兜底新建 (#1714) #1715

Merged
auto-approve-bot merged 1 commits from feature/upload-complete-idempotency-hevc-orphan-1714 into develop 2026-09-05 16:07:45 +08:00

1 Commits

Author SHA1 Message Date
saas-backend-agent 31cef633ee fix(upload): complete接口幂等去重 + HEVC转码回写占位asset禁止兜底新建 (#1714)
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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 31s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 32s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m30s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m36s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m51s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m16s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m56s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 5m18s
AI Code Review / AI Code Review (pull_request) Successful in 6m15s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 6m36s
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 / CI Gate (pull_request) Successful in 1s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m18s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 7s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 23s
P0 complete 幂等:
- complete/上传去重三级:client_upload_id(客户端幂等token) → file_hash →
  同库同名近期(30min)活动占位兜底;旧客户端不传hash/token时,complete
  超时重试不再重复建 PROCESSING 记录和 ingest job
- 幂等检查前置到 OSS file_exists 之前:重复 complete 即使 OSS 对象已不存在
  也返回已存在记录(duplicated=true),不404、不重复建库
- multipart 上传同 token 重复提交直接返回,不再传 OSS
- 新仓储方法全部 getattr 鸭子类型,旧仓储/mock 零破坏

P1 HEVC 转码孤儿:
- ingest job 透传 complete 阶段创建的占位 asset_id;worker 关联优先级
  job.asset_id → 原始 storage_key → 当前 key(旧 key),不再用转码后的
  *_h264 新 key 回查占位(旧逻辑查不到兜底新建 READY,原占位永久 processing)
- 命中占位则原地更新 READY,storage_key 同步改写为 *_h264(播放走转码产物),
  原始 key 记入 metadata(original_storage_key/hevc_transcoded)
- 无效媒体/ingest 异常路径同样回写占位为 ERROR,不再新建第二条
- 异常路径从 _h264 key 还原原始 key 多路径查找
- job_repo.update 同步 storage_key(转码改写后 DB 一致)

迁移:alembic 066(assets.client_upload_id + ingest_jobs.asset_id,含索引)

测试:新增 14 个单测(重复 complete 幂等只建一条/不重复派 job、token/hash/
兜底/窗口/旧仓储降级/OSS缺失、转码占位回写不产生重复 READY、asset_id 关联、
无占位兜底兼容、非HEVC、无效媒体/异常占位标 ERROR);全量 14281 passed
2026-09-05 15:59:52 +08:00