From 50993554d8ec62111ae3dc32bc075801a1d726dc Mon Sep 17 00:00:00 2001 From: ybyang <10629930+whybeyoung@users.noreply.github.com> Date: Sun, 14 Jun 2026 15:01:52 +0800 Subject: [PATCH] fix(health): make health-check rid unique across tokenizer workers (#28143) --- python/sglang/srt/disaggregation/encode_server.py | 7 +++++-- python/sglang/srt/entrypoints/http_server.py | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/python/sglang/srt/disaggregation/encode_server.py b/python/sglang/srt/disaggregation/encode_server.py index 6ea60c397..89c181c12 100644 --- a/python/sglang/srt/disaggregation/encode_server.py +++ b/python/sglang/srt/disaggregation/encode_server.py @@ -11,6 +11,7 @@ import pickle import threading import time import traceback +import uuid from collections import defaultdict from http import HTTPStatus from typing import Dict, List, Optional, Set, Tuple, Union @@ -2550,7 +2551,8 @@ async def _dp_worker_health_encode(enc: MMEncoder) -> None: # No processor → can't functionally probe; liveness alone is healthy. return None - req_id = f"{HEALTH_CHECK_RID_PREFIX}_{time.time()}" + # uuid keeps rids unique across workers; a bare time.time() can collide. + req_id = f"{HEALTH_CHECK_RID_PREFIX}_{uuid.uuid4().hex}" try: _, _, _, error_msg, error_code = await enc.encode( mm_items=mm_items, @@ -3757,7 +3759,8 @@ async def health_generate(): return Response(status_code=200) try: - req_id = f"{HEALTH_CHECK_RID_PREFIX}_{time.time()}" + # uuid keeps rids unique across workers; a bare time.time() can collide. + req_id = f"{HEALTH_CHECK_RID_PREFIX}_{uuid.uuid4().hex}" dummy_request = { "mm_items": mm_items, diff --git a/python/sglang/srt/entrypoints/http_server.py b/python/sglang/srt/entrypoints/http_server.py index 86efbd085..1108ea4ff 100644 --- a/python/sglang/srt/entrypoints/http_server.py +++ b/python/sglang/srt/entrypoints/http_server.py @@ -24,6 +24,7 @@ import os import tempfile import threading import time +import uuid from contextlib import asynccontextmanager from http import HTTPStatus from typing import ( @@ -607,7 +608,9 @@ async def health_generate(request: Request) -> Response: return Response(status_code=200) sampling_params = {"max_new_tokens": 1, "temperature": 0.0} - rid = f"{HEALTH_CHECK_RID_PREFIX}_{time.time()}" + # uuid keeps rids unique across tokenizer workers (a bare time.time() can + # collide and crash the shared DetokenizerManager decode_status). + rid = f"{HEALTH_CHECK_RID_PREFIX}_{uuid.uuid4().hex}" if _global_state.tokenizer_manager.is_generation: gri = GenerateReqInput(