fix: 修复 AI Code Review 阻塞级问题 v2(useCanvasPlayer 解码策略+资源泄漏+useStep6Cover 轮询超时) #1448

Closed
xiaoxia wants to merge 2 commits from fix/ai-code-review-blocking-v2 into develop
Owner

修复内容

修复 AI Code Review 在 PR #1437、#1438、#1439 中标记的 5 个阻塞级问题。

v2 版本修复了 v1 中解码状态标记顺序问题(decodedSegmentsRef.add() 必须在 await decodeSegment() 之后),确保解码失败时可重试。

useCanvasPlayer.ts(PR #1437 + #1438)

1. 初始化解码策略(#1437 阻塞1)

  • 初始化改为按需解码:只解码前 3 个片段
  • 新增 decodeAroundPosition() 函数,在渲染循环中每 200ms 动态解码当前 ±1 片段
  • seek 时重置 decodedSegmentsRef 并立即重新解码

2. 异步同步机制(#1437 阻塞2)

  • decodeSegment 使用 await decoder.flush() 等待所有帧输出
  • 解码标记 decodedSegmentsRef.add(i) 移到 await decodeSegment() 之后,失败时不标记以便重试

3. VideoFrame 资源泄漏(#1438)

  • 新增 lastDrawnFrameRef 追踪上一帧
  • renderFrame 中绘制新帧前 close() 释放上一帧
  • destroy/seek 时也做清理

useStep6Cover.ts(PR #1439)

4. 轮询超时机制(#1439 阻塞1)

  • 增加 pollCount 计数器,最大 60 次(每 2 秒,共 120 秒)
  • 增加 setTimeout 120_000 总超时保护
  • 双重超时:任一触发即 reject 并提示"预览生成超时,请稍后重试"

5. 400 错误处理(#1439 阻塞2)

  • 检查 err.response.data.codeerr.response.data.message
  • 仅当匹配"预览缺失"模式时才自动修复
  • 其他 400 走常规错误处理

验证

  • TypeScript 编译
  • ESLint
  • Prettier

Closes #1437, #1438, #1439

## 修复内容 修复 AI Code Review 在 PR #1437、#1438、#1439 中标记的 5 个阻塞级问题。 > v2 版本修复了 v1 中解码状态标记顺序问题(`decodedSegmentsRef.add()` 必须在 `await decodeSegment()` 之后),确保解码失败时可重试。 ### useCanvasPlayer.ts(PR #1437 + #1438) **1. 初始化解码策略(#1437 阻塞1)** - 初始化改为按需解码:只解码前 3 个片段 - 新增 `decodeAroundPosition()` 函数,在渲染循环中每 200ms 动态解码当前 ±1 片段 - seek 时重置 `decodedSegmentsRef` 并立即重新解码 **2. 异步同步机制(#1437 阻塞2)** - `decodeSegment` 使用 `await decoder.flush()` 等待所有帧输出 - 解码标记 `decodedSegmentsRef.add(i)` 移到 `await decodeSegment()` **之后**,失败时不标记以便重试 **3. VideoFrame 资源泄漏(#1438)** - 新增 `lastDrawnFrameRef` 追踪上一帧 - renderFrame 中绘制新帧前 `close()` 释放上一帧 - destroy/seek 时也做清理 ### useStep6Cover.ts(PR #1439) **4. 轮询超时机制(#1439 阻塞1)** - 增加 `pollCount` 计数器,最大 60 次(每 2 秒,共 120 秒) - 增加 `setTimeout 120_000` 总超时保护 - 双重超时:任一触发即 reject 并提示"预览生成超时,请稍后重试" **5. 400 错误处理(#1439 阻塞2)** - 检查 `err.response.data.code` 和 `err.response.data.message` - 仅当匹配"预览缺失"模式时才自动修复 - 其他 400 走常规错误处理 ### 验证 - TypeScript 编译 ✅ - ESLint ✅ - Prettier ✅ Closes #1437, #1438, #1439
xiaoxia added 1 commit 2026-08-19 23:21:12 +08:00
fix: 修复 AI Code Review 阻塞级问题 v2(解码策略+资源泄漏+轮询超时)
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 API Integration Tests (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 / Check if frontend-only change (pull_request) Successful in 39s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 52s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m34s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m53s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m5s
AI Code Review / AI Code Review (pull_request) Successful in 2m19s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m23s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m53s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m45s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m31s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m39s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
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 6s
632c3043bc
useCanvasPlayer:
- 初始化解码改为按需模式:仅解码前3片段 + decodeAroundPosition 动态加载 ±1 片段
- 新增 decodedSegmentsRef 追踪已解码片段,seek 时清空并重新解码
- 新增 lastDrawnFrameRef 追踪上一帧,绘制新帧前 close() 释放防止内存泄漏
- 解码标记移至 await decodeSegment() 之后,失败时不标记以便重试
- destroy 增加帧清理和状态重置

useStep6Cover:
- 轮询增加 pollCount(max 60) + setTimeout 120s 双重超时保护
- 400错误精确匹配预览缺失模式(errCode/message正则),避免误触发自动修复

Closes: #1437, #1438, #1439

🚀 预览环境已部署

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

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

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

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

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

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 1 commit 2026-08-20 11:06:02 +08:00
fix: 修复并发解码竞态——先标记再解码,失败时移除标记
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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (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 / Check if frontend-only change (pull_request) Successful in 31s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m55s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m31s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m10s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m43s
AI Code Review / AI Code Review (pull_request) Successful in 2m49s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m36s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m40s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m45s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 11m36s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
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 14s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 20s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 40s
8b53c4a130
decodeAroundPosition 和初始化循环中,将 decodedSegmentsRef.add() 移到
await decodeSegment() 之前(先标记防重入),catch 中 delete() 移除标记
(允许失败后重试)。解决渲染循环中解码未完成时下一帧重复发起解码的竞态。

Closes: #1437
Collaborator

代码审查结果 - PR #1448

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

  1. apps/web/src/pages/generate/hooks/useStep6Cover.ts 第164行:轮询超时逻辑中未清除 timeoutId,导致当 pollCount 达到上限触发 reject 后,120秒的总超时定时器仍会触发并再次 reject Promise。虽然多次 reject Promise 通常不会导致崩溃,但属于逻辑错误,可能引起控制台报错或状态混乱。
    • 修改建议:在 pollCount >= maxPolls 的判断块内添加 clearTimeout(timeoutId)

💡 建议(2个可选)

  1. apps/web/src/pages/generate/hooks/useCanvasPlayer.ts 第540行decodeAroundPosition 函数中查找 targetIdx 使用了线性遍历 (O(N)),而该函数在 renderFrame 渲染循环中被高频调用。如果视频片段数量较多(如几百上千个),会导致显著的性能开销。
    • 修改建议:由于 metas 是按时间排序的,建议使用二分查找来定位当前片段,或者根据 currentTime 的递增特性优化搜索范围。
  2. apps/web/src/pages/generate/hooks/useCanvasPlayer.ts 第742行seek 函数虽然清空了队列和状态,但并未取消正在进行的异步解码任务(decodeSegment)。如果用户快速拖拽进度条,会触发大量并发解码请求,尽管旧帧会被丢弃,但会浪费大量 CPU 资源。
    • 修改建议:引入 AbortController 或类似的取消机制,在 seek 时取消正在进行的 decodeSegment 操作。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-08-20 03:08:50 | 模型:

## 代码审查结果 - PR #1448 ### ⚠️ 问题(1个需要修改) 1. **apps/web/src/pages/generate/hooks/useStep6Cover.ts 第164行**:轮询超时逻辑中未清除 `timeoutId`,导致当 `pollCount` 达到上限触发 reject 后,120秒的总超时定时器仍会触发并再次 reject Promise。虽然多次 reject Promise 通常不会导致崩溃,但属于逻辑错误,可能引起控制台报错或状态混乱。 - **修改建议**:在 `pollCount >= maxPolls` 的判断块内添加 `clearTimeout(timeoutId)`。 ### 💡 建议(2个可选) 1. **apps/web/src/pages/generate/hooks/useCanvasPlayer.ts 第540行**:`decodeAroundPosition` 函数中查找 `targetIdx` 使用了线性遍历 (`O(N)`),而该函数在 `renderFrame` 渲染循环中被高频调用。如果视频片段数量较多(如几百上千个),会导致显著的性能开销。 - **修改建议**:由于 `metas` 是按时间排序的,建议使用二分查找来定位当前片段,或者根据 `currentTime` 的递增特性优化搜索范围。 2. **apps/web/src/pages/generate/hooks/useCanvasPlayer.ts 第742行**:`seek` 函数虽然清空了队列和状态,但并未取消正在进行的异步解码任务(`decodeSegment`)。如果用户快速拖拽进度条,会触发大量并发解码请求,尽管旧帧会被丢弃,但会浪费大量 CPU 资源。 - **修改建议**:引入 `AbortController` 或类似的取消机制,在 `seek` 时取消正在进行的 `decodeSegment` 操作。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-20 03:08:50 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia closed this pull request 2026-08-20 11:28:01 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1448 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
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 / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (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 / Check if frontend-only change (pull_request) Successful in 31s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m55s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m31s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m10s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m43s
AI Code Review / AI Code Review (pull_request) Successful in 2m49s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m36s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m40s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m45s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 11m36s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
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 14s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 20s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 40s

Pull request closed

Sign in to join this conversation.