{"record":{"id":"b209c6c29e41b93f","repo":"sgl-project/sglang","slug":"received-truncated-fd-header-len-data-fd-i","errorCode":null,"errorMessage":"received truncated fd header: {len(data)} < {_FD_INDEX_STRUCT.size}","messagePattern":"received truncated fd header: (.+?) < (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/weight_cache/transport.py","lineNumber":44,"sourceCode":"\n\ndef _send_fd(sock: socket.socket, fd: int, index: int) -> None:\n    payload = _FD_INDEX_STRUCT.pack(index)\n    fds = array.array(\"i\", [int(fd)])\n    sent = sock.sendmsg(\n        [payload], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds.tobytes())]\n    )\n    if sent != len(payload):\n        raise RuntimeError(f\"sendmsg sent {sent} bytes, expected {len(payload)}\")\n\n\ndef _recv_fd(sock: socket.socket) -> Tuple[int, int]:\n    fd_item_size = array.array(\"i\").itemsize\n    data, ancdata, _, _ = sock.recvmsg(\n        _FD_INDEX_STRUCT.size, socket.CMSG_SPACE(fd_item_size)\n    )\n    if len(data) != _FD_INDEX_STRUCT.size:\n        raise RuntimeError(\n            f\"received truncated fd header: {len(data)} < {_FD_INDEX_STRUCT.size}\"\n        )\n    index = _FD_INDEX_STRUCT.unpack(data)[0]\n    fds = array.array(\"i\")\n    for level, cmsg_type, cmsg_data in ancdata:\n        if level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:\n            fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fd_item_size)])\n    if len(fds) != 1:\n        for fd in fds:\n            os.close(fd)\n        raise RuntimeError(f\"expected one fd, got {len(fds)}\")\n    return int(index), int(fds[0])\n\n\nclass WeightCacheTransportBackend(ABC):\n    name: str\n\n    @abstractmethod","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/weight_cache/transport.py#L26-L62","documentation":"_recv_fd expected a fixed-size fd-index header but recvmsg returned fewer bytes — the peer sent a truncated or malformed FD message over the SCM_RIGHTS channel.","triggerScenarios":"Peer closed or sent garbage instead of the packed fd-index struct; version mismatch between transport endpoints.","commonSituations":"Daemon crash mid FD handoff; mixing sglang versions on client and daemon sides of the VMM/torch IPC transport.","solutions":["Restart daemon and client with matching sglang versions","Check daemon logs for the underlying crash","Report if it persists with matching versions (protocol bug)"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    idx, fd = _recv_fd(sock)\nexcept RuntimeError as e:\n    if 'truncated' in str(e): abort_transport()","preventionTips":["Pin matching sglang versions on both ends","Treat malformed frames as protocol corruption"],"tags":["ipc","fd-passing","protocol"],"backgroundTag":"truncated-protocol-header","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}