XX-net/XX-Net · warning

roundtrip time:%f transfer_no:%d send:%d recv:%d unpack_erro

Error message

roundtrip time:%f transfer_no:%d send:%d recv:%d unpack_error:%s

What it means

Server error-report with error_code 2: the server could not unpack the request data for the given transfer number. The transfer's data_info is marked 'timeout' and the roundtrip loop continues with other transfers.

Source

Thrown at code/default/x_tunnel/local/proxy_session.py:994

                magic, version, pack_type = struct.unpack("<cBB", payload.get(3))
                if magic != b"P" or version != g.protocol_version or pack_type not in [2, 3]:
                    xlog.warn("get data head:%s", utils.str2hex(content[:2]))
                    data_info["stat"] = "timeout"
                    time.sleep(sleep_time)
                    continue

                if pack_type == 3:  # error report
                    error_code, message_len = struct.unpack("<BH", payload.get(3))
                    message = payload.get(message_len)
                    # xlog.warn("report code:%d, msg:%s", error_code, message)
                    if error_code == 1:
                        # no quota
                        xlog.warn("x_server error:no quota")
                        self.stop()
                        return
                    elif error_code == 2:
                        # unpack error
                        xlog.warn("roundtrip time:%f transfer_no:%d send:%d recv:%d unpack_error:%s",
                                  roundtrip_time, transfer_no, send_data_len, len(content), message)
                        data_info["stat"] = "timeout"
                        continue
                    elif error_code == 3:
                        # session not exist
                        if self.session_id == request_session_id:
                            xlog.warn("server session_id:%s not exist, reset session.", request_session_id)
                            self.reset()
                        return
                    else:
                        xlog.error("unknown error code:%d, message:%s", error_code, message)
                        time.sleep(sleep_time)
                        continue

                server_time, time_cost, server_send_pool_size, data_len, ack_len, rcvd_no_len, sent_no_len, unack_snd_sn_len, ext_len \
                    = struct.unpack("<dIIIIIIII", payload.get(40))
                head_len = (content_len - data_len - ack_len - rcvd_no_len - sent_no_len - unack_snd_sn_len - ext_len)
                if head_len < 3 + 40:

View on GitHub (pinned to cfa5bc17b6)

Solutions

  1. Update XX-Net client so pack/unpack logic matches the server version
  2. Retry the request — transient corruption marks only this transfer as timeout
  3. Check network stability (packet loss, middleboxes mangling TLS/stream)
  4. Report with the logged transfer_no and send/recv lengths if persistent
Defensive patterns

Strategy: retry

Prevention

When it happens

Trigger: Corrupted or truncated request payload (network corruption), protocol/library version mismatch between client and server unpackers, or oversized payloads exceeding server limits.

Common situations: Flaky connections corrupting frames, client/server version skew after partial upgrade, or compression/buffer boundary bugs.

Related errors


AI-assisted analysis of XX-net/XX-Net@cfa5bc17b6 (2026-08-27). Data as JSON: /api/errors/5cad119a59b7c64c. Report an issue: GitHub.