From 8c643a246f1f2a1b6efe7fcb5d23c6d82798502a Mon Sep 17 00:00:00 2001 From: talora Date: Thu, 19 Feb 2026 03:49:34 -0800 Subject: [PATCH 1/3] Fixed async writing to the same file in metrics exporter --- .../srt/managers/request_metrics_exporter.py | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/python/sglang/srt/managers/request_metrics_exporter.py b/python/sglang/srt/managers/request_metrics_exporter.py index 2ecc655b765e..ca4db1a9b6ff 100644 --- a/python/sglang/srt/managers/request_metrics_exporter.py +++ b/python/sglang/srt/managers/request_metrics_exporter.py @@ -87,6 +87,7 @@ def __init__( # File handler state management self._current_file_handler = None + self._current_file_lock = asyncio.Lock() self._current_hour_suffix = None def _ensure_file_handler(self, hour_suffix: str): @@ -135,20 +136,21 @@ async def write_record( current_time = datetime.now() hour_suffix = current_time.strftime("%Y%m%d_%H") - # Ensure correct file handler is open for current hour - self._ensure_file_handler(hour_suffix) + async with self._current_file_lock: + # Ensure correct file handler is open for current hour + self._ensure_file_handler(hour_suffix) - if self._current_file_handler is None: - return + if self._current_file_handler is None: + return - metrics_data = self._format_output_data(obj, out_dict) + metrics_data = self._format_output_data(obj, out_dict) - def write_file(): - json.dump(metrics_data, self._current_file_handler) - self._current_file_handler.write("\n") - self._current_file_handler.flush() + def write_file(): + json.dump(metrics_data, self._current_file_handler) + self._current_file_handler.write("\n") + self._current_file_handler.flush() - await asyncio.to_thread(write_file) + await asyncio.to_thread(write_file) except Exception as e: logger.exception(f"Failed to write perf metrics to file: {e}") From 39eec95d9882bb7d49e290c1792fc4dba27e97eb Mon Sep 17 00:00:00 2001 From: talora Date: Thu, 19 Feb 2026 03:54:48 -0800 Subject: [PATCH 2/3] Changed to RWLock utility --- python/sglang/srt/managers/request_metrics_exporter.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/sglang/srt/managers/request_metrics_exporter.py b/python/sglang/srt/managers/request_metrics_exporter.py index ca4db1a9b6ff..f46c0d304251 100644 --- a/python/sglang/srt/managers/request_metrics_exporter.py +++ b/python/sglang/srt/managers/request_metrics_exporter.py @@ -9,6 +9,7 @@ from sglang.srt.managers.io_struct import EmbeddingReqInput, GenerateReqInput from sglang.srt.server_args import ServerArgs +from sglang.srt.utils.aio_rwlock import RWLock logger = logging.getLogger(__name__) @@ -87,7 +88,7 @@ def __init__( # File handler state management self._current_file_handler = None - self._current_file_lock = asyncio.Lock() + self._current_file_lock = RWLock() self._current_hour_suffix = None def _ensure_file_handler(self, hour_suffix: str): @@ -136,7 +137,7 @@ async def write_record( current_time = datetime.now() hour_suffix = current_time.strftime("%Y%m%d_%H") - async with self._current_file_lock: + async with self._current_file_lock.writer_lock: # Ensure correct file handler is open for current hour self._ensure_file_handler(hour_suffix) From 1e35220b373ccea04e662dc0e2f17463da8f7916 Mon Sep 17 00:00:00 2001 From: talora Date: Sun, 22 Feb 2026 03:55:19 -0800 Subject: [PATCH 3/3] changed to regular asyncio lock --- python/sglang/srt/managers/request_metrics_exporter.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/python/sglang/srt/managers/request_metrics_exporter.py b/python/sglang/srt/managers/request_metrics_exporter.py index f46c0d304251..ca4db1a9b6ff 100644 --- a/python/sglang/srt/managers/request_metrics_exporter.py +++ b/python/sglang/srt/managers/request_metrics_exporter.py @@ -9,7 +9,6 @@ from sglang.srt.managers.io_struct import EmbeddingReqInput, GenerateReqInput from sglang.srt.server_args import ServerArgs -from sglang.srt.utils.aio_rwlock import RWLock logger = logging.getLogger(__name__) @@ -88,7 +87,7 @@ def __init__( # File handler state management self._current_file_handler = None - self._current_file_lock = RWLock() + self._current_file_lock = asyncio.Lock() self._current_hour_suffix = None def _ensure_file_handler(self, hour_suffix: str): @@ -137,7 +136,7 @@ async def write_record( current_time = datetime.now() hour_suffix = current_time.strftime("%Y%m%d_%H") - async with self._current_file_lock.writer_lock: + async with self._current_file_lock: # Ensure correct file handler is open for current hour self._ensure_file_handler(hour_suffix)