{"record":{"id":"8c1c4fcf54048b41","repo":"XX-net/XX-Net","slug":"unregister-s-e-r","errorCode":null,"errorMessage":"unregister %s e:%r","messagePattern":"unregister (.+?) e:%r","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"code/default/x_tunnel/local/base_container.py","lineNumber":573,"sourceCode":"                            self._debug_log(\"Conn session:%s conn:%d local recv len:%d pos:%d\",\n                                            self.session.session_id, conn.conn_id, data_len, conn.received_position)\n\n                            conn.transfer_received_data(data)\n                    elif event & selectors.EVENT_WRITE:\n                        conn.blocked = False\n                        conn.process_cmd()\n                    else:\n                        self.xlog.debug(\"no event for conn:%d\", conn.conn_id)\n                        self.close_sock(sock, \"no_event\")\n\n            except Exception as e:\n                xlog.exception(\"recv_worker e:%r\", e)\n\n        for sock in dict(self.sock_conn_map):\n            try:\n                self.select2.unregister(sock)\n            except Exception as e:\n                xlog.warn(\"unregister %s e:%r\", sock, e)\n        self.sock_conn_map = {}\n        self._debug_log(\"ConnectionPipe stop\")\n        self.th = None\n        self.session.check_upload()\n\n\nclass Conn(object):\n    def __init__(self, session, conn_id, sock, host, port, windows_size, windows_ack, is_client, xlog):\n        # xlog.info(\"session:%s conn:%d host:%s port:%d\", session.session_id, conn_id, host, port)\n        self.host = host\n        self.port = port\n        self.session = session\n        self.conn_id = conn_id\n        self.sock = sock\n        self.windows_size = windows_size\n        self.windows_ack = windows_ack\n        self.is_client = is_client\n","sourceCodeStart":555,"sourceCodeEnd":591,"githubUrl":"https://github.com/XX-net/XX-Net/blob/cfa5bc17b67676e467f37ec50766127e0ab5f0aa/code/default/x_tunnel/local/base_container.py#L555-L591","documentation":"During ConnectionPipe stop, unregistering a socket from the selector raised (usually because the fd was already closed/unregistered). Cleanup continues for remaining sockets; this is mostly benign shutdown noise.","triggerScenarios":"pipe_worker teardown loops over sock_conn_map and calls select2.unregister on sockets already closed elsewhere.","commonSituations":"Normal during process exit or tunnel restart; can indicate double-unregister races if frequent during operation.","solutions":["Ignore if only seen at shutdown","Check for double close/unregister paths if seen during runtime","Ensure stop() is idempotent"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    select2.unregister(sock)\nexcept Exception:\n    pass  # fd already gone during shutdown","preventionTips":["Make stop() idempotent","Ignore selector errors during teardown"],"tags":["x-tunnel","selector","shutdown","cleanup"],"backgroundTag":"socket-unregister-failed","analyzedSha":"cfa5bc17b67676e467f37ec50766127e0ab5f0aa","analyzedAt":"2026-08-27T19:28:28.225Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}