{"record":{"id":"af0729e7f67871da","repo":"XX-net/XX-Net","slug":"check-upload-not-acked-found-transfer-no-d-upload","errorCode":null,"errorMessage":"check_upload_not_acked found transfer_no:%d upload timeout:%f","messagePattern":"check_upload_not_acked found transfer_no:(.+?) upload timeout:(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"code/default/x_tunnel/local/proxy_session.py","lineNumber":703,"sourceCode":"        server_local_time = server_time - self.server_time_offset\n        if self.server_time_deviation > g.config.server_time_max_deviation:\n            return\n\n        timeout_num = 0\n        entry_time = time.time()\n        with self.lock:\n            now = time.time()\n            if now - entry_time > 0.1:\n                xlog.error(\"check_upload_not_acked lock time:%f\", now - entry_time)\n                return\n\n            for no, data_info in self.transfer_list.items():\n                if data_info[\"stat\"] == \"timeout\":\n                    continue\n\n                if data_info[\"server_received\"] == False and server_local_time - data_info[\"start_time\"] > g.config.send_timeout_retry:\n                    data_info[\"stat\"] = \"timeout\"\n                    xlog.warn(\"check_upload_not_acked found transfer_no:%d upload timeout:%f\", no,\n                              server_local_time - data_info[\"start_time\"])\n                    timeout_num += 1\n                    continue\n\n                if data_info[\"server_sent\"] and server_time - data_info[\"server_sent\"] > g.config.send_timeout_retry:\n                    data_info[\"stat\"] = \"timeout\"\n                    xlog.warn(\"check_upload_not_acked found transfer_no:%d down timeout:%f\", no,\n                              server_time - data_info[\"server_sent\"])\n                    timeout_num += 1\n                    continue\n\n        if timeout_num:\n            self.target_on_roads = \\\n                min(g.config.concurent_thread_num - g.config.min_on_road, self.target_on_roads + timeout_num)\n            self.trigger_more()\n\n    def process_server_received_transfer_no(self, server_received_no_list, server_sent_no_list, server_time):\n        server_received_next_no = struct.unpack(\"<I\", server_received_no_list.get(4))[0]","sourceCodeStart":685,"sourceCodeEnd":721,"githubUrl":"https://github.com/XX-net/XX-Net/blob/cfa5bc17b67676e467f37ec50766127e0ab5f0aa/code/default/x_tunnel/local/proxy_session.py#L685-L721","documentation":"In the round-trip path, check_upload_not_acked scans transfer_list for transfers whose upload has not been acknowledged by the server (server_received == False) and whose age exceeds g.config.send_timeout_retry, marking them 'timeout' and logging the elapsed time so they will be resent. It distinguishes a lost upload (this warning) from a lost download (server_sent timeout handled separately).","triggerScenarios":"A transfer's data never reached/registered on the server within send_timeout_retry seconds — upstream packet loss to the relay, a congested uplink, or a stalled server worker that received the data but never acked.","commonSituations":"Slow or lossy uplinks (asymmetric ADSL/satellite), uplink saturation by large uploads, relay overload, send_timeout_retry set lower than real upload+ack RTT, WiFi interference.","solutions":["Raise g.config.send_timeout_retry to exceed your worst-case upload+ack latency, especially for large transfer chunks.","Measure uplink quality (loss, bandwidth) and throttle concurent_thread_num to avoid saturating it.","If acks are consistently slow while pings are fine, check relay/server load and switch front IPs (g.tls_relay_front).","Rely on the built-in resend: transfers marked 'timeout' are retransmitted automatically."],"exampleFix":"# before\nsend_timeout_retry = 4\n\n# after\nsend_timeout_retry = 15","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Tune send_timeout_retry above worst-case upload+ack time.","Limit concurrent uploads to avoid uplink saturation.","Use the automatic resend of timed-out transfers; do not double-send manually."],"tags":["timeout","upload","ack","reliability"],"backgroundTag":"ack-timeout","analyzedSha":"cfa5bc17b67676e467f37ec50766127e0ab5f0aa","analyzedAt":"2026-08-27T19:28:28.225Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}