From a10eee3d80516f8e0d3466856c4be8d542d93b7a Mon Sep 17 00:00:00 2001 From: Hanming Lu <69857889+hanming-lu@users.noreply.github.com> Date: Tue, 16 Jun 2026 14:49:35 -0700 Subject: [PATCH] [Tokenizer] Fix abort racing server crash when large amount of aborts (#28341) --- python/sglang/srt/managers/tokenizer_manager.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/python/sglang/srt/managers/tokenizer_manager.py b/python/sglang/srt/managers/tokenizer_manager.py index 31c556e53..7d2da7a5f 100644 --- a/python/sglang/srt/managers/tokenizer_manager.py +++ b/python/sglang/srt/managers/tokenizer_manager.py @@ -2654,7 +2654,19 @@ class TokenizerManager(TokenizerControlMixin, TokenizerManagerScoreMixin): def _handle_abort_req(self, recv_obj: AbortReq): if is_health_check_generate_req(recv_obj): return - state = self.rid_to_state[recv_obj.rid] + # Two scheduler messages can race in handle_loop for the same rid: a + # batch output that finishes it normally (deletes rid_to_state[rid]) + # and this abort echo. If the finish wins, the rid is already gone and + # there is nothing left to abort. Common under mass client + # disconnects, amplified by prefix / abort_all fan-out. + state = self.rid_to_state.get(recv_obj.rid) + if state is None: + logger.info( + "Abort request for rid=%s not found in rid_to_state; " + "likely already finished/removed.", + recv_obj.rid, + ) + return state.finished = True state.time_stats.set_finished_time()