{"record":{"id":"8839508a7ee39e56","repo":"sgl-project/sglang","slug":"shared-memory-name-not-found","errorCode":null,"errorMessage":"Shared memory {name} not found","messagePattern":"Shared memory (.+?) not found","errorType":"exception","errorClass":"FileNotFoundError","httpStatus":null,"severity":"critical","filePath":"python/sglang/srt/managers/multi_tokenizer_mixin.py","lineNumber":806,"sourceCode":"            shm.unlink()\n            shm = shared_memory.SharedMemory(create=True, size=size, name=name)\n    except FileNotFoundError:\n        # If not present, create new shared memory\n        shm = shared_memory.SharedMemory(create=True, size=size, name=name)\n\n    shm.buf[:size] = serialized\n    return shm\n\n\ndef read_from_shared_memory(name: str) -> Any:\n    \"\"\"Read data from shared memory\"\"\"\n    try:\n        shm = shared_memory.SharedMemory(name=name)\n        data = pickle.loads(bytes(shm.buf))\n        shm.close()\n        return data\n    except FileNotFoundError:\n        raise FileNotFoundError(f\"Shared memory {name} not found\")\n\n\ndef write_data_for_multi_tokenizer(\n    port_args: PortArgs,\n    server_args: ServerArgs,\n    scheduler_info: Dict,\n):\n    \"\"\"Write args information to share memory for multi-tokenizer\"\"\"\n    # get main process ID\n    main_pid = get_main_process_id()\n    current_pid = os.getpid()\n    logger.info(f\"main process ID: {main_pid}, current process ID: {current_pid}\")\n    args = (port_args, server_args, scheduler_info)\n    args_shm = write_to_shared_memory(args, f\"multi_tokenizer_args_{current_pid}\")\n    args_shm.close()\n\n    return args_shm\n","sourceCodeStart":788,"sourceCodeEnd":824,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/managers/multi_tokenizer_mixin.py#L788-L824","documentation":"During multi-tokenizer startup the scheduler publishes state (tokenizer/scheduler info) via POSIX shared memory; read_from_shared_memory re-raises FileNotFoundError when the named segment does not exist — typically a race where the reader runs before the writer creates it, or the writer crashed.","triggerScenarios":"init_multi_tokenizer reading shm before the parent process called write_data_for_multi_tokenizer; a crashed scheduler leaving no segment; stale name/port mismatch after restart.","commonSituations":"Enabling the multi-tokenizer path under load where init races; container restarts with leftover state; version changes to the shm protocol.","solutions":["Retry the read with a short backoff until the writer creates the segment, or ensure write_data_for_multi_tokenizer completed before init","Check scheduler process liveness — if it crashed, fix the root crash first","Verify the PortArgs-derived shm name matches across processes"],"exampleFix":"// before\ndata = read_from_shared_memory(name)\n// after\nfor _ in range(50):\n    try:\n        data = read_from_shared_memory(name); break\n    except FileNotFoundError:\n        time.sleep(0.1)","handlingStrategy":"retry","validationCode":"import os\n# ensure writer side has run before init\nfrom sglang.srt.managers.multi_tokenizer_mixin import read_from_shared_memory","typeGuard":null,"tryCatchPattern":"for attempt in range(100):\n    try:\n        data = read_from_shared_memory(name)\n        break\n    except FileNotFoundError:\n        if scheduler_process.is_alive() is False:\n            raise\n        time.sleep(0.1)","preventionTips":["Sequence startup: write shm before spawning readers","Monitor scheduler liveness; treat persistent miss as writer crash"],"tags":["sglang","shared-memory","startup","race-condition","file-not-found"],"backgroundTag":"shared-memory-segment-not-found","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}