fix: 兜底关联edit plan和回写config移到enqueue之前,消除竞态条件 #1482
Reference in New Issue
Block a user
Delete Branch "fix/race-condition-fallback-plan-association"
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?
问题
create_generation_task接口中,兜底关联 edit plan 和回写 plan.config 的逻辑在safe_enqueue_generation_task之后执行。Worker 在 enqueue 后立即读取 task_info,此时source_edit_plan_id仍为空,导致报错 "source_edit_plan_id is required"。修复
source_edit_plan_id,在 enqueue 前通过template_id + user_id查找并关联 plan_writeback_edit_plan_config移到 enqueue 之前:确保 worker 读取 plan 时 config 中已包含generation_task_idtask.source_edit_plan_id(包含兜底结果),而非仅request.source_edit_plan_id改动文件
apps/api/app/api/routes/generation_tasks.py:+149/-39,调整执行顺序tests/unit/test_race_condition_fallback_plan.py:新增 3 个回归测试验证
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[tests/unit/test_race_condition_fallback_plan.py: 69-72] 测试用例对代码格式过于敏感
test_fallback_before_enqueue通过遍历行字符串来定位代码位置(如"not task.source_edit_plan_id and request.template_id" in line)。如果未来代码格式化工具(如 Black)将此长条件拆分为多行,或者变量名换行,测试将无法匹配到行号而报错。建议利用 AST 节点的lineno属性直接获取关键语句的行号,而不是依赖文本字符串匹配,以提高测试的健壮性。[tests/unit/test_race_condition_fallback_plan.py: 93-97] 测试断言逻辑存在误判风险
test_writeback_uses_effective_plan_id中,断言检查try_block文本块中是否包含"task.source_edit_plan_id"。由于try_block包含了上方的“兜底关联逻辑”(其中包含task.source_edit_plan_id = ...),因此即使“回写逻辑”部分错误地使用了request.source_edit_plan_id,该断言依然会通过。建议将检查范围缩小到_writeback_edit_plan_config调用附近的代码上下文,或者确保检测到的变量确实位于回写逻辑的赋值/调用表达式中。✅ 良好实践
generation_task)及配置回写操作移至safe_enqueue_generation_task之前,确保了 Worker 消费任务时数据已完备,有效修复了竞态条件隐患。try-except中,即使查找失败也不影响主任务创建流程,符合兜底逻辑的设计原则。len(created_tasks) == 0确保批量生成场景下配置回写操作仅执行一次,避免重复覆盖。✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能无明显问题
🤖 由 AI 代码审查机器人自动生成 | 2026-08-24 08:40:34 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1482 已关闭或合并,对应的预览环境已被清理。