Prhub

#24522 [PD] Fix missing update_status call in abort() across all KV backends

原始 PR 作者 merrymercy 合并时间 2026-05-06 20:30 文件变更 4 提交数 4 评论 4 代码增减 +3 / -19

执行摘要

修复 PD 场景下 abort() 状态同步缺失

所有 KV 后端(Nixl、Mooncake、Mori)的 abort() 方法都只设置了本地 conclude_state = KVPoll.Failed,但没有调用 update_status() 同步到 manager 的共享 request_status 字典,导致管理者无法感知 request 已失败。此 PR 统一修复了 CommonKVSender/Receiver 基类,并清理了子类中的冗余覆盖。

值得阅读,尤其关注 common/conn.py 中的基类修复模式——通过统一基类而非各处修改来修复跨后端的 bug,是良好的工程实践。Mooncake 子类删除后应关注是否有其他自定义行为丢失(经检查没有)。

讨论亮点

gemini-code-assist[bot] 对 req_time_stats.py 新增的注释提出语法修正:'capture' 应改为 'captures'。该建议未被采纳(PR 已合并,最终代码中仍为 'capture')。没有其他架构讨论。

实现拆解

  1. 修复基类 abort()——common/conn.py
    - 在 CommonKVSender.abort()CommonKVReceiver.abort() 中,将原来的注释 # Explicitly set the status to failure since this request has been aborted 替换为实际的 self.kv_mgr.update_status(self.bootstrap_room, KVPoll.Failed) 调用。
    - 这样 Nixl 等直接继承 Common 类的后端自动获得修复。

  2. 删除 Mooncake 子类冗余 abort()——mooncake/conn.py
    - MooncakeKVSenderMooncakeKVReceiver 各自定义了一个与父类(CommonKVSender/Receiver)完全相同的 abort() 方法(只有 record_failure 和设置 conclude_state,缺少 update_status)。
    - 直接删除这两个子类方法,令其继承父类修复后的实现。
    - AscendKV(继承自 Mooncake)亦随之修复。

  3. 清理 Mori 子类中的冗余 update_status 调用——mori/conn.py
    - MoriKVReceiver.abort() 在调用 super().abort() 之后又重复调用了 self.kv_mgr.update_status(),由于父类现已包含 update_status,删除该重复调用。

  4. 补充注释——req_time_stats.py
    - 在 compute_and_observe_kv_transfer_metrics() 的传输延迟计算处添加注释说明只捕获最后一个 chunk 的时间。

文件 模块 状态 重要度
python/sglang/srt/disaggregation/common/conn.py 连接层 modified 5.7
python/sglang/srt/disaggregation/mooncake/conn.py 连接层 modified 6.58
python/sglang/srt/disaggregation/mori/conn.py 连接层 modified 4.18
python/sglang/srt/observability/req_time_stats.py 可观测性 modified 3.38

关键符号

abort

关键源码片段

python/sglang/srt/disaggregation/mooncake/conn.py core-logic

删除 MooncakeKVSender 和 MooncakeKVReceiver 的冗余 abort() 方法(与父类完全一致),使继承链清晰并自动应用父类修复。

# MooncakeKVSender.abort() 和 MooncakeKVReceiver.abort() 已被删除,
# 现在它们直接继承 CommonKVSender/CommonKVReceiver 的 fix 版本:
#
# def abort(self):
# self.kv_mgr.record_failure(...)
# self.kv_mgr.update_status(self.bootstrap_room, KVPoll.Failed) # 新增
# self.conclude_state = KVPoll.Failed
python/sglang/srt/disaggregation/mori/conn.py core-logic

删除 MoriKVReceiver.abort() 中的冗余 update_status 调用(已被父类包含)。

def abort(self):
    if self.bootstrap_room is None:
        return
    super().abort() # 父类现在已包含 update_status
    # 删除重复调用 : self.kv_mgr.update_status(self.bootstrap_room, KVPoll.Failed)
    self.clear()

评论区精华

注释语法修正 style

gemini-code-assist[bot] 建议将新增注释中的 'capture' 改为 'captures'。

结论:未被采纳,最终代码仍为 'capture'。 · 已解决

风险与影响

低风险。变更集中在 abort() 路径(异常流程),不影响正常传输逻辑。删除 Mooncake 子类方法后必须确认父类行为完全一致(已通过 diff 验证)。Mori 子类删除冗余调用后功能不变。风险标签:核心路径变更、缺少测试覆盖。

  • 影响范围:PD 模式下所有 KV 后端(Nixl、Mooncake、Mori、Ascend)的 abort 逻辑。
  • 用户影响:当请求被 abort 时,manager 能正确感知失败状态,避免悬空请求或资源泄漏。
  • 团队影响:简化了代码结构,统一了状态传播路径,降低后续维护成本。
核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论