From 263eab9f5d6659633dfede1634be542fa2e09004 Mon Sep 17 00:00:00 2001 From: ishandhanani <82981111+ishandhanani@users.noreply.github.com> Date: Fri, 31 Oct 2025 11:34:57 -0700 Subject: [PATCH] fix: dummy health check server not accessible on non-zero rank nodes (#12297) --- python/sglang/compile_deep_gemm.py | 20 +++++++++++++------- python/sglang/srt/utils/common.py | 26 +++++++++++++++++--------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/python/sglang/compile_deep_gemm.py b/python/sglang/compile_deep_gemm.py index 739b907bf..7e1e68301 100644 --- a/python/sglang/compile_deep_gemm.py +++ b/python/sglang/compile_deep_gemm.py @@ -104,15 +104,21 @@ def launch_server_process_and_send_one_request( if response.status_code == 200: # Rank-0 node send a request to sync with other node and then return. if server_args.node_rank == 0: + payload = { + "input_ids": [0, 1, 2, 3], + "sampling_params": { + "max_new_tokens": 8, + "temperature": 0, + }, + } + # In PD mode, include fake bootstrap fields so workers don't assert + if server_args.disaggregation_mode != "null": + payload["bootstrap_host"] = FAKE_BOOTSTRAP_HOST + payload["bootstrap_room"] = 0 + response = requests.post( f"{base_url}/generate", - json={ - "input_ids": [0, 1, 2, 3], - "sampling_params": { - "max_new_tokens": 8, - "temperature": 0, - }, - }, + json=payload, timeout=600, ) if response.status_code != 200: diff --git a/python/sglang/srt/utils/common.py b/python/sglang/srt/utils/common.py index 0c1a13b5f..244b8fc35 100644 --- a/python/sglang/srt/utils/common.py +++ b/python/sglang/srt/utils/common.py @@ -2351,16 +2351,24 @@ def launch_dummy_health_check_server(host, port, enable_metrics): ) server = uvicorn.Server(config=config) - try: - loop = asyncio.get_running_loop() - logger.info( - f"Dummy health check server scheduled on existing loop at {host}:{port}" - ) - loop.create_task(server.serve()) + # Run server in a background daemon thread with its own event loop + # This prevents blocking the main thread while still serving health checks + def run_server(): + try: + asyncio.run(server.serve()) + except Exception as e: + logger.error(f"Dummy health check server failed to start: {e}") + raise + finally: + logger.info(f"Dummy health check server stopped at {host}:{port}") - except RuntimeError: - logger.info(f"Starting dummy health check server at {host}:{port}") - server.run() + thread = threading.Thread( + target=run_server, daemon=True, name="health-check-server" + ) + thread.start() + logger.info( + f"Dummy health check server started in background thread at {host}:{port}" + ) def create_checksum(directory: str):