XX-net/XX-Net · warning
send_conn_data but not running
Error message
send_conn_data but not running
What it means
send_conn_data is invoked (from create_conn, transfer_received_data, transfer_ack, or transfer_peer_close) with data for a connection, but proxy_session.running is False — the session is stopped or was never successfully started. The upload is dropped with this warning because there is no transport to send on.
Source
Thrown at code/default/x_tunnel/local/proxy_session.py:529
pass
# self.conn_list = {}
xlog.debug("stop all connection finished")
def remove_conn(self, conn_id):
try:
if conn_id in self.conn_list:
conn = self.conn_list[conn_id]
# xlog.debug("remove conn:%d %s:%d", conn_id, conn.host, conn.port)
del self.conn_list[conn_id]
except Exception as e:
xlog.warn("remove conn:%d except:%r", conn_id, e)
if len(self.conn_list) == 0:
self.target_on_roads = 0
def send_conn_data(self, conn_id, data):
if not self.running:
xlog.warn("send_conn_data but not running")
return
# xlog.debug("upload conn:%d, len:%d", conn_id, len(data))
buf = base_container.WriteBuffer()
buf.append(struct.pack("<II", conn_id, len(data)))
buf.append(data)
self.send_buffer.put(buf)
if self.oldest_received_time == 0:
self.oldest_received_time = time.time()
elif self.send_buffer.pool_size > g.config.max_payload:
# xlog.debug("notify on send conn data")
self.wait_queue.notify()
@staticmethod
def sn_payload_head(sn, payload):
return struct.pack("<II", sn, len(payload))
View on GitHub (pinned to cfa5bc17b6)
Solutions
- Only route client traffic after session.start() succeeds; gate the local proxy listener on session.running.
- Retry the request after the session is re-established (login succeeds and running is True).
- During shutdown, close accepted client sockets first so handlers don't attempt uploads on a dead session.
Example fix
# before
sock = listener.accept(); session_conn.send_conn_data(conn_id, data)
# after
if not session.running:
session.start()
if session.running:
session.send_conn_data(conn_id, data) Defensive patterns
Strategy: validation
Validate before calling
if not proxy_session.running:
proxy_session.start()
assert proxy_session.running, 'tunnel not running'
proxy_session.send_conn_data(conn_id, data) Type guard
def session_active(session) -> bool:
return bool(getattr(session, 'running', False)) Prevention
- Start the proxy listener only after session.start() succeeds.
- Check session.running before every upload batch.
- Close client sockets before stopping the session.
When it happens
Trigger: Any client traffic arriving after session stop() (or after a failed start/login), e.g. an in-flight HTTP proxy request whose upload path runs while the session is shutting down or re-logging-in.
Common situations: Restart/relogin windows where the local proxy still accepts client connections; requests in flight when the tunnel drops; code that starts the proxy listener before verifying session.start() returned True.
Related errors
- body len:%d %s %s
- session try to run but is running.
- stopping conn:%d fail:%r
- check_upload_not_acked found transfer_no:%d upload timeout:%
AI-assisted analysis of XX-net/XX-Net@cfa5bc17b6 (2026-08-27).
Data as JSON: /api/errors/c05e23d785048c55.
Report an issue: GitHub.