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

Merged
auto-approve-bot merged 3 commits from fix/ai-code-review-blocking-v3 into develop 2026-08-20 12:01:01 +08:00
Owner

修复内容

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

v3:基于最新 develop(含解码进度日志+flush超时保护),解决前两版 AI Review 指出的并发竞态和超时清理问题。

useCanvasPlayer.ts(PR #1437 + #1438)

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

  • 初始化改为按需解码:只解码前 3 个片段
  • 新增 decodeAroundPosition() 在渲染循环中每 200ms 动态解码当前 ±1 片段
  • seek 时重置解码标记并重新解码目标区域

2. 并发解码竞态修复(#1437 阻塞2 + v2 Review 反馈)

  • 采用先标记再解码模式:decodedSegmentsRef.add(i)await decodeSegment() → 失败时 delete(i)
  • 防止渲染循环中解码未完成时下一帧重复发起解码

3. VideoFrame 资源泄漏(#1438)

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

useStep6Cover.ts(PR #1439)

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

  • pollCount(max 60, 每2s) + setTimeout 120s 双重超时保护
  • 所有退出路径均正确 clearTimeout + clearInterval(修复 v2 Review 反馈)

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 个阻塞级问题。 > v3:基于最新 develop(含解码进度日志+flush超时保护),解决前两版 AI Review 指出的并发竞态和超时清理问题。 ### useCanvasPlayer.ts(PR #1437 + #1438) **1. 初始化解码策略(#1437 阻塞1)** - 初始化改为按需解码:只解码前 3 个片段 - 新增 `decodeAroundPosition()` 在渲染循环中每 200ms 动态解码当前 ±1 片段 - seek 时重置解码标记并重新解码目标区域 **2. 并发解码竞态修复(#1437 阻塞2 + v2 Review 反馈)** - 采用**先标记再解码**模式:`decodedSegmentsRef.add(i)` → `await decodeSegment()` → 失败时 `delete(i)` - 防止渲染循环中解码未完成时下一帧重复发起解码 **3. VideoFrame 资源泄漏(#1438)** - 新增 `lastDrawnFrameRef` 追踪上一帧 - renderFrame 中绘制新帧前 `close()` 释放上一帧 - destroy/seek 时也做清理 ### useStep6Cover.ts(PR #1439) **4. 轮询超时机制(#1439 阻塞1)** - `pollCount`(max 60, 每2s) + `setTimeout 120s` 双重超时保护 - **所有退出路径均正确 `clearTimeout` + `clearInterval`**(修复 v2 Review 反馈) **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-20 11:28:30 +08:00
fix: 修复 AI Code Review 阻塞级问题 v3(解码策略+资源泄漏+轮询超时)
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 1m10s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m45s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m12s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m36s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m48s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m59s
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 Lint (pull_request) Successful in 2m36s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m53s
AI Code Review / AI Code Review (pull_request) Failing after 6m50s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m45s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 11m14s
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 / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Deploy 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 13s
f729524ad0
useCanvasPlayer (PR #1437 + #1438):
- 初始化解码改为按需模式:仅解码前3片段 + decodeAroundPosition 动态加载 ±1 片段
- 解码标记采用先add再decode模式(防并发重入),catch中delete允许失败重试
- 新增 lastDrawnFrameRef 追踪上一帧,绘制新帧前 close() 释放防止内存泄漏
- seek 时清空帧队列+释放上一帧+重置解码标记+重新解码目标区域
- destroy 增加帧清理和解码状态重置

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

Closes: #1437, #1438, #1439

🚀 预览环境已部署

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

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

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

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

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

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 1 commit 2026-08-20 11:44:36 +08:00
fix: 修复 AI Code Review v4(VideoFrame 所有权+解码并发竞态)
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 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 50s
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 / Frontend Unit Tests (pull_request) Successful in 50s
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m51s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m58s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m25s
AI Code Review / AI Code Review (pull_request) Failing after 2m26s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m36s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m12s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m16s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m34s
CI/CD Pipeline / Validate - Code Quality (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
e3e57d236a
- 移除 lastDrawnFrameRef:getCurrentFrame 返回 FrameQueue 内部引用,帧生命周期由 FrameQueue 管理(push 淘汰/close 时释放),渲染层不应 close
- 引入 decodeGenerationRef 计数器:seek/destroy 时递增,decodeAroundPosition 在 await 前后检查代数是否匹配,避免并发竞态
- 初始化解码循环同样加入 generation 检查
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:是
  • 阻塞级问题数量:2 个

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:2 个

🔴 阻塞级问题(必须修复)

  1. [apps/web/src/pages/generate/hooks/useStep6Cover.ts: 155-175] 轮询逻辑存在并发请求风险

    • 问题类型:逻辑bug / 性能问题
    • 问题描述:使用了 setInterval 来触发异步的 getPreviewStatus 请求。如果单次网络请求耗时超过 2s(间隔时间),下一次定时器触发时会启动新的并发请求。随着时间推移,可能导致大量并发请求(请求风暴),对后端造成压力,且 pollCount 计数逻辑将失效(基于时间而非请求完成数)。
    • 修改建议:改用递归 setTimeout 模式,确保上一次请求完成后再发起下一次请求;或者在回调开始时检查是否已有请求正在进行。
  2. [apps/web/src/pages/generate/hooks/useCanvasPlayer.ts: 762-776] 重播时未清除已解码标记导致黑屏风险

    • 问题类型:逻辑bug
    • 问题描述:decodedSegmentsRef 用于记录已解码的片段索引,仅在 seekdestroy 时被清除。当视频播放结束再次点击 play(或循环播放)时,currentTime 重置为 0,但 decodedSegmentsRef 仍保留旧索引。由于 FrameQueue 是环形缓冲区(容量10),旧帧可能已被覆盖。此时 decodeAroundPosition 因索引存在于 Set 中而跳过解码,导致 getCurrentFrame 获取不到帧而黑屏。
    • 修改建议:在 play 函数开始时,或检测到 currentTime 从末尾重置到开头时,需调用 decodedSegmentsRef.current.clear()

💡 改进建议(不阻塞合并)

  1. [apps/web/src/pages/generate/hooks/useCanvasPlayer.ts: 558-591] 解码失败重试缺乏退避策略

    • 具体内容:decodeAroundPosition 中捕获异常后仅打印警告并移除标记,这会导致下一帧渲染循环立即重试。如果解码持续失败(如数据损坏),会造成高频无效调用。建议增加简单的重试次数限制或延迟重试机制。
  2. [apps/web/src/pages/generate/hooks/useStep6Cover.ts: 145-175] 轮询超时控制逻辑冗余

    • 具体内容:同时使用了 setTimeout (120s) 和 pollCount (60次 * 2s = 120s) 进行双重超时保护。虽然逻辑上能跑通,但增加了代码复杂度和清理逻辑的负担。建议统一使用递归 setTimeout 并在内部维护计数或时间戳。

良好实践

  • useCanvasPlayer 中引入 decodeGenerationRef(代数计数器)来作废过期的异步解码任务,这是处理异步竞态条件的优秀模式,有效避免了 seek 时旧解码任务覆盖新状态。
  • useStep6Cover 中对 400 错误进行了细化判断(正则匹配 message),避免了误将其他业务 400 错误当作“预览缺失”处理,提升了健壮性。

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


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

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:2 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/web/src/pages/generate/hooks/useStep6Cover.ts: 155-175] 轮询逻辑存在并发请求风险** - 问题类型:逻辑bug / 性能问题 - 问题描述:使用了 `setInterval` 来触发异步的 `getPreviewStatus` 请求。如果单次网络请求耗时超过 2s(间隔时间),下一次定时器触发时会启动新的并发请求。随着时间推移,可能导致大量并发请求(请求风暴),对后端造成压力,且 `pollCount` 计数逻辑将失效(基于时间而非请求完成数)。 - 修改建议:改用递归 `setTimeout` 模式,确保上一次请求完成后再发起下一次请求;或者在回调开始时检查是否已有请求正在进行。 2. **[apps/web/src/pages/generate/hooks/useCanvasPlayer.ts: 762-776] 重播时未清除已解码标记导致黑屏风险** - 问题类型:逻辑bug - 问题描述:`decodedSegmentsRef` 用于记录已解码的片段索引,仅在 `seek` 和 `destroy` 时被清除。当视频播放结束再次点击 `play`(或循环播放)时,`currentTime` 重置为 0,但 `decodedSegmentsRef` 仍保留旧索引。由于 `FrameQueue` 是环形缓冲区(容量10),旧帧可能已被覆盖。此时 `decodeAroundPosition` 因索引存在于 Set 中而跳过解码,导致 `getCurrentFrame` 获取不到帧而黑屏。 - 修改建议:在 `play` 函数开始时,或检测到 `currentTime` 从末尾重置到开头时,需调用 `decodedSegmentsRef.current.clear()`。 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/pages/generate/hooks/useCanvasPlayer.ts: 558-591] 解码失败重试缺乏退避策略** - 具体内容:`decodeAroundPosition` 中捕获异常后仅打印警告并移除标记,这会导致下一帧渲染循环立即重试。如果解码持续失败(如数据损坏),会造成高频无效调用。建议增加简单的重试次数限制或延迟重试机制。 2. **[apps/web/src/pages/generate/hooks/useStep6Cover.ts: 145-175] 轮询超时控制逻辑冗余** - 具体内容:同时使用了 `setTimeout` (120s) 和 `pollCount` (60次 * 2s = 120s) 进行双重超时保护。虽然逻辑上能跑通,但增加了代码复杂度和清理逻辑的负担。建议统一使用递归 `setTimeout` 并在内部维护计数或时间戳。 ### ✅ 良好实践 - `useCanvasPlayer` 中引入 `decodeGenerationRef`(代数计数器)来作废过期的异步解码任务,这是处理异步竞态条件的优秀模式,有效避免了 seek 时旧解码任务覆盖新状态。 - `useStep6Cover` 中对 400 错误进行了细化判断(正则匹配 `message`),避免了误将其他业务 400 错误当作“预览缺失”处理,提升了健壮性。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-20 03:46:58 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia added 1 commit 2026-08-20 11:49:38 +08:00
fix: 修复 AI Code Review v5(轮询请求重叠+重播黑屏)
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1m0s
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 / Validate - Migration (alembic) (pull_request) Successful in 2m28s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m29s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m25s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m51s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m7s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m1s
CI/CD Pipeline / PR Build 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 / Frontend Lint (pull_request) Successful in 2m20s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m18s
AI Code Review / AI Code Review (pull_request) Successful in 7m2s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 9m42s
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 / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Deploy 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 45s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m9s
9cdbe6e97d
- useStep6Cover: setInterval 改为递归 setTimeout,确保上一次请求完成后再发起下一次,避免请求风暴
- useCanvasPlayer play(): 检测重播场景(currentTime 接近0但 decodedSegmentsRef 非空)时清空标记并递增 generation,让 decodeAroundPosition 重新解码
auto-approve-bot merged commit 634d05c010 into develop 2026-08-20 12:01:01 +08:00
auto-approve-bot deleted branch fix/ai-code-review-blocking-v3 2026-08-20 12:01:01 +08:00

🗑️ 预览环境已清理

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

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

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