Prhub

#38663 [Feat][Core] safely abort requests when FSM fails to advance

原始 PR 作者 walterbm 合并时间 2026-04-06 23:00 文件变更 3 提交数 5 评论 12 代码增减 +164 / -13

执行摘要

修复结构化输出 FSM 失败时请求挂起的 bug,安全中止请求。

PR body指出:'When using structured outputs with the xgrammar backend, streaming requests would hang indefinitely if the FSM failed to advance.' 作者在Issue评论中表示在Cohere遇到此问题,使得区分程序bug和生成超时困难,目的是使失败场景更明确。

建议工程师阅读以了解FSM失败处理的设计决策,特别是resumable字段的重用和状态管理;关注调度器update_from_output方法的变更,这对理解结构化输出错误处理有价值。

讨论亮点

review中,gemini-code-assist[bot]指出代码冗余访问request.structured_output_request,建议使用局部变量;yewentao256询问拒绝token是否传递给下游,作者解释token不会传递,请求终止;njhill建议状态使用FINISHED_ERROR而非ABORTED,并质疑新增字段必要性,最终作者采纳,简化代码,重用resumable字段。所有讨论已解决。

实现拆解

主要修改在vllm/v1/core/sched/scheduler.py的update_from_output方法:添加逻辑检查FSM是否拒绝token,若拒绝则设置request.status = RequestStatus.FINISHED_ERROR和request.resumable = False。移除了原PR中的fsm_failed_to_advance字段,重用现有resumable机制。测试文件添加了两个单元测试验证同步和异步调度器行为。

文件 模块 状态 重要度
vllm/v1/core/sched/scheduler.py scheduler modified 8.0
tests/v1/core/test_scheduler.py test modified 5.0
tests/v1/core/test_async_scheduler.py test modified 5.0

关键符号

update_from_output test_abort_request_when_structured_output_fsm_cannot_advance

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

代码冗余访问优化 style

gemini-code-assist[bot] 指出在 update_from_output 方法中冗余访问 request.structured_output_request,建议使用局部变量 struct_output_request 以提高代码清晰度。

结论:作者可能已采纳建议,最终代码使用局部变量,但未明确显示在最终 patch 中;从讨论上下文看,问题已解决。 · 已解决

token 传递下游的正确性 正确性

yewentao256 询问当 FSM 拒绝 token 时,这些 token 是否会被传递给下游处理,可能影响输出完整性。

结论:作者 walterbm 解释拒绝的 token 不会传递,请求会终止,确保正确性。 · 已解决

状态设置和字段简化设计 设计

njhill 建议使用 FINISHED_ERROR 状态而非 ABORTED,并质疑新增 fsm_failed_to_advance 字段的必要性,提议重用现有 resumable 字段以简化设计。

结论:作者采纳建议,移除新字段,在 update_from_output 中设置 request.resumable = False,简化代码并保持一致性。 · 已解决

风险与影响

修改了核心调度器逻辑,可能引入回归,影响结构化输出请求的处理;需确保FSM失败检测在所有结构化输出后端(如xgrammar)中正确工作;测试覆盖了特定场景,但未覆盖所有边界情况,如并发请求或复杂语法。

用户影响:修复了请求挂起问题,提升流式请求的可靠性和用户体验;系统影响:确保资源正确释放,避免内存或KV缓存泄露;团队影响:代码更简洁,使用现有机制,便于维护。

核心调度器变更 结构化输出边界情况

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论