{"record":{"id":"602e6f757efe1dec","repo":"sgl-project/sglang","slug":"sendmsg-sent-sent-bytes-expected-len-payload","errorCode":null,"errorMessage":"sendmsg sent {sent} bytes, expected {len(payload)}","messagePattern":"sendmsg sent (.+?) bytes, expected (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/weight_cache/transport.py","lineNumber":35,"sourceCode":"\nfrom .protocol import send_msg\n\nlogger = logging.getLogger(__name__)\n\nTORCH_IPC_BACKEND = \"torch_ipc\"\nVMM_FD_BACKEND = \"vmm_fd\"\n\n_FD_INDEX_STRUCT = struct.Struct(\"<Q\")\n\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:","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/weight_cache/transport.py#L17-L53","documentation":"_send_fd used sendmsg to pass a file descriptor and it transmitted fewer bytes than the 4-byte fd-index payload. Should not happen on a healthy socket; indicates a partial write or closed connection.","triggerScenarios":"Sending an FD over the weight cache transport when the peer socket is closed or the kernel did a short send.","commonSituations":"Daemon exited while the client was sending tensors; abrupt socket shutdown during FD transfer.","solutions":["Verify peer liveness before transferring FDs","Retry the whole transfer after restarting the daemon","Check for protocol misuse (sending on a closed socket)"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    _send_fd(sock, index, fd)\nexcept RuntimeError:\n    restart_daemon_and_retry()","preventionTips":["Confirm peer is reading before FD transfer","Handle short-send as fatal for the transfer, retry whole session"],"tags":["ipc","fd-passing","sendmsg","weight-cache"],"backgroundTag":"partial-socket-write","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}