{"record":{"id":"303b5fb80c73c7e5","repo":"sgl-project/sglang","slug":"no-transfer-engine-info-for-rank-rank","errorCode":null,"errorMessage":"No transfer engine info for rank {rank}","messagePattern":"No transfer engine info for rank (.+?)","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"warning","filePath":"python/sglang/srt/entrypoints/engine_info_bootstrap_server.py","lineNumber":83,"sourceCode":"                logger.info(\n                    f\"Registered transfer engine info for tp_rank={tp_rank}, \"\n                    f\"session_id={session_id}\"\n                )\n                return PlainTextResponse(\"OK\")\n            except Exception as e:\n                logger.error(f\"Failed to register engine info: {e}\")\n                raise HTTPException(status_code=400, detail=str(e))\n\n        @app.get(\"/get_transfer_engine_info\")\n        def get_transfer_engine_info(rank: int):\n            if rank < 0:\n                raise HTTPException(status_code=400, detail=\"Invalid rank parameter\")\n\n            with self.lock:\n                info = self.transfer_engine_info.get(rank)\n\n            if info is None:\n                raise HTTPException(\n                    status_code=404,\n                    detail=f\"No transfer engine info for rank {rank}\",\n                )\n\n            return {\"rank\": rank, \"remote_instance_transfer_engine_info\": list(info)}\n\n        config = uvicorn.Config(app, host=host, port=port, log_level=\"warning\")\n        self._server = uvicorn.Server(config)\n        self._thread = threading.Thread(\n            target=self._server.run,\n            daemon=True,\n        )\n        self._thread.start()\n        logger.info(f\"EngineInfoBootstrapServer started on {host}:{port}\")\n\n    def close(self):\n        self._server.should_exit = True\n        self._thread.join(timeout=5)","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/entrypoints/engine_info_bootstrap_server.py#L65-L101","documentation":"GET /get_transfer_engine_info returns HTTP 404 when the requested rank hasn't (yet) registered its transfer-engine info with the bootstrap server. Registration happens asynchronously per rank during startup, so early or out-of-order queries find no entry yet.","triggerScenarios":"Querying a rank before that rank's worker has completed its /register_transfer_engine_info call — e.g. polling too early during engine startup, or asking for a rank >= the number of registered workers.","commonSituations":"Startup race where consumers poll for info before producers register; querying a rank that crashed before registering; misconfigured world size making clients ask for nonexistent ranks.","solutions":["Retry with backoff until the rank registers or a startup timeout expires — this is normally a race, not a permanent failure.","Verify the target rank actually exists in this deployment's world size and that its worker is alive.","Check the registering worker's logs if a rank never registers (it may have crashed — see its traceback)."],"exampleFix":"# before\nr = requests.get(url, params={\"rank\": rank})\ninfo = r.json()  # 404 -> JSONDecodeError\n\n# after\nfor _ in range(60):\n    r = requests.get(url, params={\"rank\": rank})\n    if r.status_code == 200:\n        info = r.json(); break\n    time.sleep(1)","handlingStrategy":"retry","validationCode":"def get_info(session, url, rank, attempts=60, delay=1.0):\n    for _ in range(attempts):\n        r = session.get(url, params={\"rank\": rank})\n        if r.status_code == 200:\n            return r.json()\n        if r.status_code != 404:\n            r.raise_for_status()\n        time.sleep(delay)\n    raise TimeoutError(f\"rank {rank} never registered\")","typeGuard":null,"tryCatchPattern":"while True:\n    r = requests.get(url, params={\"rank\": rank})\n    if r.status_code == 200:\n        return r.json()\n    if r.status_code != 404:\n        r.raise_for_status()\n    time.sleep(1)","preventionTips":["Poll with backoff during startup instead of assuming registration is complete.","Gate queries on the engine's ready signal before fetching rank info.","Confirm the rank exists in world_size; a permanently-missing rank usually means that worker crashed."],"tags":["sglang","http-404","race-condition","bootstrap-server"],"backgroundTag":"resource-not-yet-available","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}