Handle coredump dirs and cache hit updates (#30897)

Co-authored-by: Yongji Wu <30348494+libertyeagle@users.noreply.github.com>
This commit is contained in:
Lianmin Zheng
2026-07-12 00:37:43 -07:00
committed by GitHub
co-authored by Yongji Wu
parent f1c247edf9
commit 81d273f73b
3 changed files with 66 additions and 11 deletions
+3 -3
View File
@@ -2900,9 +2900,9 @@ class Scheduler(
# skip staging requests that are ongoing prefetch # skip staging requests that are ongoing prefetch
continue continue
# Pop the number of tokens loaded from storage (L3 hits) # Pop the number of tokens loaded from storage (L3 hits)
req.storage_hit_length = self.tree_cache.pop_prefetch_loaded_tokens( loaded_tokens = self.tree_cache.pop_prefetch_loaded_tokens(req.rid)
req.rid if loaded_tokens > 0:
) req.storage_hit_length = loaded_tokens
req.init_next_round_input(self.tree_cache) req.init_next_round_input(self.tree_cache)
res = adder.add_one_req( res = adder.add_one_req(
+20 -8
View File
@@ -6425,14 +6425,26 @@ class ServerArgs:
os.environ[key] = value os.environ[key] = value
logger.info("Auto-set %s=%s (from --crash-dump-folder)", key, value) logger.info("Auto-set %s=%s (from --crash-dump-folder)", key, value)
if key == "CUDA_COREDUMP_FILE": coredump_dir = os.path.dirname(
# cuda curedump cannot write to a folder that does not exist, os.environ["CUDA_COREDUMP_FILE"].replace("%h", socket.gethostname())
# so we have to create the folder first. )
hostname = socket.gethostname() if "%" in coredump_dir:
os.makedirs( logger.warning(
os.path.join(self.crash_dump_folder, hostname), "Cannot pre-create CUDA coredump directory %s: only %%h is "
exist_ok=True, "supported in the directory part of CUDA_COREDUMP_FILE; "
) "coredumps may fail to write.",
coredump_dir,
)
elif coredump_dir:
try:
os.makedirs(coredump_dir, exist_ok=True)
except OSError as e:
logger.warning(
"Failed to create CUDA coredump directory %s: %s; "
"coredumps may fail to write.",
coredump_dir,
e,
)
def _handle_debug_utils(self): def _handle_debug_utils(self):
if is_in_ci() and self.soft_watchdog_timeout is None: if is_in_ci() and self.soft_watchdog_timeout is None:
@@ -1,6 +1,7 @@
import importlib import importlib
import json import json
import os import os
import socket
import tempfile import tempfile
import unittest import unittest
from types import SimpleNamespace from types import SimpleNamespace
@@ -1294,6 +1295,48 @@ class TestSamplingBackendTokenOracleEnvGate(CustomTestCase):
self.assertEqual(parsed.sampling_backend, "token_oracle") self.assertEqual(parsed.sampling_backend, "token_oracle")
class TestHandleCrashDumpEnv(CustomTestCase):
_COREDUMP_ENV_KEYS = (
"CUDA_ENABLE_COREDUMP_ON_EXCEPTION",
"CUDA_ENABLE_USER_TRIGGERED_COREDUMP",
"CUDA_COREDUMP_SHOW_PROGRESS",
"CUDA_COREDUMP_GENERATION_FLAGS",
"CUDA_COREDUMP_FILE",
"CUDA_COREDUMP_PIPE",
)
def _run_handler(self, crash_dump_folder, preset_env=None):
server_args = ServerArgs.__new__(ServerArgs)
server_args.crash_dump_folder = crash_dump_folder
with patch.dict(os.environ, preset_env or {}):
for key in self._COREDUMP_ENV_KEYS:
if key not in (preset_env or {}):
os.environ.pop(key, None)
ServerArgs._handle_crash_dump_env(server_args)
def test_creates_coredump_dir_when_auto_set(self):
with tempfile.TemporaryDirectory() as tmp:
self._run_handler(tmp)
self.assertTrue(
os.path.isdir(os.path.join(tmp, socket.gethostname())),
"coredump dir not created for auto-set CUDA_COREDUMP_FILE",
)
def test_creates_coredump_dir_when_env_preset(self):
# Regression test: when CUDA_COREDUMP_FILE is preset, the coredump
# directory must still be created up front.
with tempfile.TemporaryDirectory() as tmp:
preset_dir = os.path.join(tmp, "preset-location")
self._run_handler(
tmp,
preset_env={"CUDA_COREDUMP_FILE": f"{preset_dir}/%h/core.cuda.%t.%p"},
)
self.assertTrue(
os.path.isdir(os.path.join(preset_dir, socket.gethostname())),
"coredump dir not created for preset CUDA_COREDUMP_FILE",
)
class TestGrpcServerArgs(CustomTestCase): class TestGrpcServerArgs(CustomTestCase):
"""Native gRPC is enabled by --grpc-port (or SGLANG_GRPC_PORT) and runs """Native gRPC is enabled by --grpc-port (or SGLANG_GRPC_PORT) and runs
alongside HTTP; --smg-grpc-mode (and the deprecated --grpc-mode) select the alongside HTTP; --smg-grpc-mode (and the deprecated --grpc-mode) select the