# PR #28086 完整报告

- 仓库：`sgl-project/sglang`
- 标题：Abort during chunked prefill + PD peer-liveness abort
- 合并时间：2026-06-18 14:13
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/28086

---

# 执行摘要

- 一句话：实现分块预填充中止与 PD 对端存活检测
- 推荐动作：值得精读，特别是 `process_pending_chunked_abort` 的安全中止模式（延迟处理 + 多个调度点）和 `resolve_waiting_queue_bootstrap` 的对端检测集成方式。测试代码也提供了良好的端到端验证范例。建议熟悉 scheduler 和 PD 模块的团队成员优先 Review。

# 功能与动机

PR body 指出：'Two abort improvements for the PD / chunked-prefill path.' 在 chunked prefill 场景下，原有中止请求只在分块之间生效，分块处理中无法立即中止。PD 模式下对端失效后没有自动中止机制，可能导致请求挂起。该 PR 通过记录待中止的 chunked request 并在调度器安全点清理，以及添加对端存活轮询，解决了这些问题。

# 实现拆解

1. **安全中止标记与延迟清理**：在 `scheduler.py` 的 `init_chunked_prefill` 中新增 `_pending_chunked_abort_req` 属性；`abort_request` 仅将目标请求赋值给此标记，避免在迭代中途直接销毁。新增 `process_pending_chunked_abort` 方法，在每个调度步 `get_next_batch_to_run` 开头调用。
2. **中止逻辑**：`process_pending_chunked_abort` 判断待中止请求是否为当前分块（`chunked_req`）。若是，则调用 `prepare_abort` 标记中止、释放 KV 缓存（含 disagg sender/metadata buffer）、清空 `chunked_req` 并通知 tokenizer；若不是，则在请求完结后清除标记。在 disagg prefill 模式下还处理 `maybe_release_metadata_buffer` 和 `release_kv_cache`。
3. **对端存活检测**：在 `disaggregation/prefill.py` 中新增 `resolve_waiting_queue_bootstrap`，在 `get_next_disagg_prefill_batch_to_run` 中调用。该方法遍历等待队列中未中止的请求，通过 `poll_and_all_reduce_attn_cp_tp_group` 检测 `disagg_kv_sender` 状态。若收到 `KVPoll.Failed`，则调用 `handle_bootstrap_failure` 中止请求并从等待队列移除；若 `KVPoll.WaitingForInput` 且请求已乐观完成 bootstrap，则调用 `finalize_bootstrap`。
4. **入口集成**：修改 `get_next_batch_to_run`（统一模式）和 `get_next_disagg_prefill_batch_to_run`（PD 模式）的调度步骤，分别插入 `process_pending_chunked_abort` 和 `resolve_waiting_queue_bootstrap`。
5. **配套调整**：在 `batch_result_processor.py` 中微调结果处理以跳过已中止的 chunk；更新单元测试 mock（`test_scheduler_chunked_req_gate.py`）以初始化 `_pending_chunked_abort_req`。

关键文件：
- `python/sglang/srt/managers/scheduler.py`（模块 调度器；类别 source；类型 core-logic；符号 process_pending_chunked_abort）: 核心调度器，新增 process_pending_chunked_abort 方法实现 chunked prefill 中止安全处理，并在 get_next_batch_to_run 入口调用。
- `python/sglang/srt/disaggregation/prefill.py`（模块 预填充管理；类别 source；类型 core-logic；符号 resolve_waiting_queue_bootstrap）: 预填充管理，新增 resolve_waiting_queue_bootstrap 方法检测对端存活并处理失效，集成到 get_next_disagg_prefill_batch_to_run。
- `python/sglang/test/manual/disaggregation/test_disaggregation_peer_liveness_abort.py`（模块 对端存活测试；类别 test；类型 test-coverage；符号 _body_text, _decode_response, _finish_reason, _is_abort_result）: 新增手动测试，验证 PD 对端失效后自动中止并恢复，覆盖对端存活检测核心场景。
- `python/sglang/test/manual/disaggregation/test_chunked_prefill_abort.py`（模块 分块中止测试；类别 test；类型 test-coverage；符号 _decode_response, _is_abort_result, TestChunkedPrefillAbortE2E, test_abort_mid_chunked_prefill_by_rid）: 新增手动测试，验证统一模式下 chunked prefill 中止功能。
- `test/registered/disaggregation/test_disaggregation_basic.py`（模块 PT 测试套件；类别 test；类型 test-coverage；符号 _decode_response, _is_abort_result, TestDisaggChunkedPrefillAbort, _post_abort）: 注册 CI 的测试文件，新增 TestDisaggChunkedPrefillAbort 类，将 chunked prefill 中止测试纳入持续集成。

关键符号：process_pending_chunked_abort, resolve_waiting_queue_bootstrap


# 评论区精华

- **代码风格**：merrymercy 在 review 中指出“try to remove all getattr and hasattr”，强调应避免 `getattr`，保持类型安全。作者 cctry 随即移除了相关 `getattr` 调用。
- **正确性补充**：ShangmingCai 在 `scheduler.py` 的 `process_pending_chunked_abort` 中建议添加 `req.time_stats.trace_ctx.abort` 调用以保持与其它中止路径一致。作者采纳并添加。
- **CI 测试注册**：ShangmingCai 在 approve 评论中建议“Should we pick and register one of the tests in test/registered/disaggregation/test_disaggregation_basic.py?”。作者随后将 `TestDisaggChunkedPrefillAbort` 类加入该注册测试文件，并调整了 CI 预估时间。

 - 使用 getattr 的代码风格 (style): 作者移除了 getattr 调用，改用直接属性访问。
 - 缺少 trace abort 调用 (correctness): 在 process_pending_chunked_abort 中添加了 trace_ctx.abort 调用，与其他中止路径一致。
- 将测试注册到 CI (testing): 作者将 TestDisaggChunkedPrefillAbort 类添加到 test_disaggregation_basic.py 并注册 CI。

# 风险与影响

- 风险：
 - **核心路径变更**：`scheduler.py` 是调度器核心，新增的 `process_pending_chunked_abort` 在每个调度步调用，可能引入回归，需关注请求泄漏或死锁。
 - **PD 模式网络依赖**：`resolve_waiting_queue_bootstrap` 中引入的 `poll_and_all_reduce_attn_cp_tp_group` 网络轮询可能增加 PD 模式下请求入队延迟，若网络抖动可能误判对端失败。
 - **KV 缓存释放安全性**：中止路径中的 `release_kv_cache` 和 `maybe_release_metadata_buffer` 必须与主路径一致，避免双重释放或泄漏。
 - **测试时长**：新增的 CI 测试（预估时间从 560 秒提升到 700 秒）可能增加 CI 流水线耗时。
- 影响：
 - **用户影响**：chunked prefill 场景下调用 `abort_request` 可立即停止分块处理，PD 模式下对端失效的请求自动中止，无需手动干预，提升用户体验。
 - **系统影响**：调度器增加了 `_pending_chunked_abort_req` 属性和两步检查，引入的判断开销极低；PD 模式下每步调度增加一次全量请求的轮询，对规模化部署可能产生轻微延迟。
 - **团队影响**：新增的手动测试和 CI 测试为后续类似功能提供了代码模板，降低测试编写门槛。
 - 风险标记：核心调度路径变更 , PD 模式依赖网络 , 新增 CI 测试时长增加

# 关联脉络

- 暂无明显关联 PR