From 827389c7d77f0ed9d820bc54d8ce0810b29fc932 Mon Sep 17 00:00:00 2001 From: yhyang201 Date: Sat, 9 May 2026 07:41:00 +0200 Subject: [PATCH 1/3] Fix PD bootstrap failure handling Co-Authored-By: Cheng Wan --- python/sglang/srt/disaggregation/common/conn.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/sglang/srt/disaggregation/common/conn.py b/python/sglang/srt/disaggregation/common/conn.py index 8400630943da..1fcd91d9cdfc 100644 --- a/python/sglang/srt/disaggregation/common/conn.py +++ b/python/sglang/srt/disaggregation/common/conn.py @@ -608,6 +608,8 @@ def init(self, prefill_dp_rank: int): self.prefill_dp_rank = prefill_dp_rank self._setup_bootstrap_infos() + if self.conclude_state == KVPoll.Failed: + return self.kv_mgr.update_status(self.bootstrap_room, KVPoll.WaitingForInput) def _setup_bootstrap_infos(self): @@ -650,6 +652,7 @@ def _setup_bootstrap_infos(self): self.kv_mgr.update_status( self.bootstrap_room, KVPoll.Failed ) + self.bootstrap_infos = None return self.bootstrap_infos = bootstrap_infos From 702e0c5abbe8270d7004479939b4aae34ab64c33 Mon Sep 17 00:00:00 2001 From: yhyang201 Date: Sat, 9 May 2026 10:34:07 +0200 Subject: [PATCH 2/3] Skip external DP rank routing in prefill disaggregation mode Ported from sgl-project/sglang@48135b23711550960019fc9f5adcc48818923c68 Co-Authored-By: Cheng Wan --- .../sglang/srt/managers/data_parallel_controller.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/python/sglang/srt/managers/data_parallel_controller.py b/python/sglang/srt/managers/data_parallel_controller.py index 57632e146d94..f0c4822ad8e6 100644 --- a/python/sglang/srt/managers/data_parallel_controller.py +++ b/python/sglang/srt/managers/data_parallel_controller.py @@ -562,6 +562,18 @@ def launch_tensor_parallel_group( def maybe_external_dp_rank_routing(self, req: Req): if req.routed_dp_rank is not None: + # In PD-prefill mode the cross-engine contract is `bootstrap_room`: + # the decode-side KV receiver locates the prefill DP rank via + # `bootstrap_room % prefill_dp_size`. Honoring an externally-set + # `routed_dp_rank` here breaks that contract whenever the two + # diverge (e.g., dynamo's KV router picks a rank for load-balance + # reasons that has no relation to `bootstrap_room`). Fall through + # to follow_bootstrap_room dispatch to keep prefill ↔ decode aligned. + if ( + self.server_args.disaggregation_mode == "prefill" + and req.bootstrap_room is not None + ): + return False logger.debug(f"Direct routing to DP rank {req.routed_dp_rank}") self.workers[req.routed_dp_rank].send_pyobj(req) return True From 49f9ac8b8c956a1bc4e8366ed2d2c88789201d22 Mon Sep 17 00:00:00 2001 From: yhyang201 Date: Sat, 9 May 2026 11:56:41 +0200 Subject: [PATCH 3/3] Revert "Skip external DP rank routing in prefill disaggregation mode" This reverts commit 702e0c5abbe8270d7004479939b4aae34ab64c33. --- .../sglang/srt/managers/data_parallel_controller.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/python/sglang/srt/managers/data_parallel_controller.py b/python/sglang/srt/managers/data_parallel_controller.py index f0c4822ad8e6..57632e146d94 100644 --- a/python/sglang/srt/managers/data_parallel_controller.py +++ b/python/sglang/srt/managers/data_parallel_controller.py @@ -562,18 +562,6 @@ def launch_tensor_parallel_group( def maybe_external_dp_rank_routing(self, req: Req): if req.routed_dp_rank is not None: - # In PD-prefill mode the cross-engine contract is `bootstrap_room`: - # the decode-side KV receiver locates the prefill DP rank via - # `bootstrap_room % prefill_dp_size`. Honoring an externally-set - # `routed_dp_rank` here breaks that contract whenever the two - # diverge (e.g., dynamo's KV router picks a rank for load-balance - # reasons that has no relation to `bootstrap_room`). Fall through - # to follow_bootstrap_room dispatch to keep prefill ↔ decode aligned. - if ( - self.server_args.disaggregation_mode == "prefill" - and req.bootstrap_room is not None - ): - return False logger.debug(f"Direct routing to DP rank {req.routed_dp_rank}") self.workers[req.routed_dp_rank].send_pyobj(req) return True