From d4a6d1c531a55b1ff5b8124547ca0937e73f728d Mon Sep 17 00:00:00 2001 From: Li Jiashu Date: Tue, 20 Oct 2026 10:45:47 +0800 Subject: [PATCH 1/2] sglang 0.9.18, vllm 0.8.17: pd router boot script logs identity + handoff Otherwise the container log shows a quiet gap between the "router: prefill / router: decode" argv line and vllm-router's own first line, with no indication that probe_identity ran (or hung) between them. Three breadcrumbs, stdout-safe: - per-IP success: "router: identity |" - per-IP sentinel: "router: identity sentinel (...reason...)" - handoff to exec: "router: boot script done, exec into router" All three go to stderr so they land in the container log; stdout stays reserved for probe_identity's return value. Sentinel reasons disambiguate the three no-identity paths (hangWatcher disabled at render, sidecar has no /engine, 90min budget exhausted). --- charts/sglang/templates/pd-ds.yaml | 18 ++++++++++++++++-- charts/vllm/templates/pd-ds.yaml | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/charts/sglang/templates/pd-ds.yaml b/charts/sglang/templates/pd-ds.yaml index 715e7fa..0c8e112 100644 --- a/charts/sglang/templates/pd-ds.yaml +++ b/charts/sglang/templates/pd-ds.yaml @@ -269,7 +269,13 @@ spec: HW_PORT={{ ternary (int $root.Values.hangWatcher.port) 0 $root.Values.hangWatcher.enabled }} probe_identity() { local ip=$1 budget=${2:-5400} waited=0 - [ "$HW_PORT" -eq 0 ] && { echo '|'; return 0; } + # The function returns the tuple on stdout; all breadcrumb logs + # go to stderr so they land in the container log instead of + # polluting the captured return value. + [ "$HW_PORT" -eq 0 ] && { + echo "router: $ip identity sentinel (hangWatcher disabled at render)" >&2 + echo '|'; return 0 + } while :; do local out # python3 heredoc: body and terminator sit at the block scalar's @@ -294,7 +300,14 @@ spec: PY ) local rrc=$? - if [ $rrc -eq 0 ]; then echo "$out"; return 0; fi + if [ $rrc -eq 0 ]; then + if [ "$out" = '|' ]; then + echo "router: $ip identity sentinel (sidecar has no /engine)" >&2 + else + echo "router: $ip identity $out" >&2 + fi + echo "$out"; return 0 + fi if [ $waited -ge $budget ]; then echo "router: $ip identity probe gave no usable answer after ${budget}s; recording ip||" >&2 echo '|'; return 0 @@ -315,6 +328,7 @@ spec: } write_role_snapshot prefill "$PF_IPS" write_role_snapshot decode "$DC_IPS" + echo "router: boot script done, exec into router" >&2 # shellcheck disable=SC2086 exec python3 -m sglang_router.launch_router \ --pd-disaggregation \ diff --git a/charts/vllm/templates/pd-ds.yaml b/charts/vllm/templates/pd-ds.yaml index cd0c8dd..59ea7f7 100644 --- a/charts/vllm/templates/pd-ds.yaml +++ b/charts/vllm/templates/pd-ds.yaml @@ -318,7 +318,13 @@ spec: HW_PORT={{ ternary (int $root.Values.hangWatcher.port) 0 $root.Values.hangWatcher.enabled }} probe_identity() { local ip=$1 budget=${2:-5400} waited=0 - [ "$HW_PORT" -eq 0 ] && { echo '|'; return 0; } + # The function returns the tuple on stdout; all breadcrumb logs + # go to stderr so they land in the container log instead of + # polluting the captured return value. + [ "$HW_PORT" -eq 0 ] && { + echo "router: $ip identity sentinel (hangWatcher disabled at render)" >&2 + echo '|'; return 0 + } while :; do local out # python3 heredoc: body and terminator sit at the block scalar's @@ -343,7 +349,14 @@ spec: PY ) local rrc=$? - if [ $rrc -eq 0 ]; then echo "$out"; return 0; fi + if [ $rrc -eq 0 ]; then + if [ "$out" = '|' ]; then + echo "router: $ip identity sentinel (sidecar has no /engine)" >&2 + else + echo "router: $ip identity $out" >&2 + fi + echo "$out"; return 0 + fi if [ $waited -ge $budget ]; then echo "router: $ip identity probe gave no usable answer after ${budget}s; recording ip||" >&2 echo '|'; return 0 @@ -364,6 +377,7 @@ spec: } write_role_snapshot prefill "$PF_IPS" write_role_snapshot decode "$DC_IPS" + echo "router: boot script done, exec into router" >&2 # shellcheck disable=SC2086 exec vllm-router \ --vllm-pd-disaggregation \ From e630293825c2060a985a412cfd5710f30a364b31 Mon Sep 17 00:00:00 2001 From: Li Jiashu Date: Tue, 20 Oct 2026 11:07:33 +0800 Subject: [PATCH 2/2] chore(charts): bump vllm to 0.8.18, sglang to 0.9.19 The prior commit's subject still references 0.9.18 / 0.8.17, but those versions belong to #72 (the engine-identity drift probe). This bump re-attaches the log-lines change to its own version pair so the followup release can be tagged cleanly. No template / values change. --- charts/sglang/Chart.yaml | 2 +- charts/vllm/Chart.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/sglang/Chart.yaml b/charts/sglang/Chart.yaml index 31035b4..f5ec047 100644 --- a/charts/sglang/Chart.yaml +++ b/charts/sglang/Chart.yaml @@ -5,7 +5,7 @@ home: https://github.com/modelsphere/helm-charts sources: - https://github.com/modelsphere/helm-charts type: application -version: 0.9.18 +version: 0.9.19 appVersion: "1.0.0" # CART is vendored under charts/cart -- already present, so no `helm dependency diff --git a/charts/vllm/Chart.yaml b/charts/vllm/Chart.yaml index f40eb8d..ac608cc 100644 --- a/charts/vllm/Chart.yaml +++ b/charts/vllm/Chart.yaml @@ -5,7 +5,7 @@ home: https://github.com/modelsphere/helm-charts sources: - https://github.com/modelsphere/helm-charts type: application -version: 0.8.17 +version: 0.8.18 appVersion: "1.0.0" # CART is vendored under charts/cart -- already present, so no `helm dependency