Prhub

#27374 fix(pd): clear stale bootstrap_room when freeing metadata buffer slot

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

执行摘要

修复 metadata 槽释放时未清零导致误报 corruption

Issue #17259 报告了 PD 分离模式下的上下文损坏 bug,PR #17430 通过 bootstrap_room 验证引入了检测机制,但未在释放槽位时清零,导致 actual_room == 0 的哨兵假设在后继复用中失效,引发约 3% 的请求被误中止(高并发 + TCP 传输场景更明显)。本 PR 修复该回归。

值得合入的低风险 bugfix。建议回顾所有 metadata buffer 其他字段(如 output_ids)是否也需要类似清理,但本 PR 范围合理。无精读必要,但可关注后续是否有追加的单元测试覆盖。

讨论亮点

Review 中 thincal 指出即使使用 RDMA(而非 TCP)传输 aux 数据,仍可能因 ZMQ TCP 通知早于 RDMA 传输完成而触发竞态,作者确认该 bug 不限于 TCP,但 TCP 下窗口更大。未被批准人对该修复无异议,直接批准。

实现拆解

  1. 定位 pop_transferred 方法:在 python/sglang/srt/disaggregation/decode.pyDecodeTransferQueue.pop_transferred() 中,释放 metadata buffer 索引的代码段。
  2. free() 之前清零 bootstrap_room:在调用 self.req_to_metadata_buffer_idx_allocator.free(idx) 前插入一行 self.metadata_buffers.bootstrap_room[idx] = 0,确保下次分配到此槽位的请求看到的初始值为 0(哨兵值),而非前一个请求的残留值。
  3. 不涉及其他文件或配置改动:该修复仅 3 行源码变更,无测试、配置或部署配套改动。
文件 模块 状态 重要度
python/sglang/srt/disaggregation/decode.py 分离调度 modified 5.22

关键符号

DecodeTransferQueue.pop_transferred

关键源码片段

python/sglang/srt/disaggregation/decode.py core-logic

核心修复文件,在 `pop_transferred` 方法中添加了 `bootstrap_room` 清零操作,消除因残留值导致的误报 corruption。

# python/sglang/srt/disaggregation/decode.py#L1670-L1688
        for i in indices_to_remove:
            if self.enable_staging and self.staging_handler.is_staging_room(
                self.queue[i].req.bootstrap_room
            ):
                self.staging_handler.unregister_decode_req(
                    self.queue[i].req.bootstrap_room
                )
            idx = self.queue[i].metadata_buffer_index
            assert idx != -1
            # Reset so the next owner sees actual_room == 0 ("not yet written")
            # instead of the stale value, avoiding a false-positive mismatch.
            self.metadata_buffers.bootstrap_room[idx] = 0
            self.req_to_metadata_buffer_idx_allocator.free(idx)
​
        self.queue = [
            entry for i, entry in enumerate(self.queue) if i not in indices_to_remove
        ]
​
        return transferred_reqs

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低:仅增加一行赋值,且赋值发生在索引释放前,不影响任何并发逻辑。回归风险仅限于若未来 metadata_buffers.bootstrap_room 的写操作有并发保护冲突(但当前无),但可忽略。

  • 用户/服务:消除 PD 分离模式下约 3% 的假阳性请求中止,特别是高并发 TCP 传输场景收益明显。
  • 系统:无性能影响(一次整数赋值)。
  • 团队:修复了之前 PR 引入的隐式缺陷,保障了 bootstrap_room 哨兵机制的可靠性。
核心路径变更 缺少测试覆盖

关联 Issue

#17259 [Critical Bug] Context corruption in PD disaggregation mode due to metadata buffer index race condition
#17430 Add bootstrap_room validation to detect metadata corruption in PD disaggregation

完整报告

参与讨论