fix: 修复 AI Code Review 阻塞级问题 v3(useCanvasPlayer 解码策略+资源泄漏+useStep6Cover 轮询超时) #1450
Reference in New Issue
Block a user
Delete Branch "fix/ai-code-review-blocking-v3"
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?
修复内容
修复 AI Code Review 在 PR #1437、#1438、#1439 中标记的 5 个阻塞级问题。
useCanvasPlayer.ts(PR #1437 + #1438)
1. 初始化解码策略(#1437 阻塞1)
decodeAroundPosition()在渲染循环中每 200ms 动态解码当前 ±1 片段2. 并发解码竞态修复(#1437 阻塞2 + v2 Review 反馈)
decodedSegmentsRef.add(i)→await decodeSegment()→ 失败时delete(i)3. VideoFrame 资源泄漏(#1438)
lastDrawnFrameRef追踪上一帧close()释放上一帧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验证
Closes #1437, #1438, #1439
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/web/src/pages/generate/hooks/useStep6Cover.ts: 155-175] 轮询逻辑存在并发请求风险
setInterval来触发异步的getPreviewStatus请求。如果单次网络请求耗时超过 2s(间隔时间),下一次定时器触发时会启动新的并发请求。随着时间推移,可能导致大量并发请求(请求风暴),对后端造成压力,且pollCount计数逻辑将失效(基于时间而非请求完成数)。setTimeout模式,确保上一次请求完成后再发起下一次请求;或者在回调开始时检查是否已有请求正在进行。[apps/web/src/pages/generate/hooks/useCanvasPlayer.ts: 762-776] 重播时未清除已解码标记导致黑屏风险
decodedSegmentsRef用于记录已解码的片段索引,仅在seek和destroy时被清除。当视频播放结束再次点击play(或循环播放)时,currentTime重置为 0,但decodedSegmentsRef仍保留旧索引。由于FrameQueue是环形缓冲区(容量10),旧帧可能已被覆盖。此时decodeAroundPosition因索引存在于 Set 中而跳过解码,导致getCurrentFrame获取不到帧而黑屏。play函数开始时,或检测到currentTime从末尾重置到开头时,需调用decodedSegmentsRef.current.clear()。💡 改进建议(不阻塞合并)
[apps/web/src/pages/generate/hooks/useCanvasPlayer.ts: 558-591] 解码失败重试缺乏退避策略
decodeAroundPosition中捕获异常后仅打印警告并移除标记,这会导致下一帧渲染循环立即重试。如果解码持续失败(如数据损坏),会造成高频无效调用。建议增加简单的重试次数限制或延迟重试机制。[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 | 模型:
🗑️ 预览环境已清理
PR #1450 已关闭或合并,对应的预览环境已被清理。