{"record":{"id":"69146c6c838b00ab","repo":"nautechsystems/nautilus_trader","slug":"previous-websocket-handler-failed-e","errorCode":null,"errorMessage":"Previous WebSocket handler failed: {e}","messagePattern":"Previous WebSocket handler failed: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/okx/src/websocket/client.rs","lineNumber":608,"sourceCode":"    /// Connect to the OKX WebSocket server.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if the connection process fails.\n    pub async fn connect(&mut self) -> anyhow::Result<()> {\n        let connect_lock = Arc::clone(&self.connect_lock);\n        let _connect_guard = connect_lock.lock().await;\n\n        if !self.handler_tasks.is_empty() && !self.handler_tasks.all_finished() {\n            anyhow::bail!(\"Cannot connect while previous WebSocket handler task is still running\");\n        }\n\n        if !self.handler_tasks.is_open() || !self.handler_tasks.is_empty() {\n            self.handler_tasks.begin_shutdown();\n            self.handler_tasks\n                .finish_shutdown(Duration::from_secs(2), Duration::from_secs(2))\n                .await\n                .map_err(|e| anyhow::anyhow!(\"Previous WebSocket handler failed: {e}\"))?;\n            self.handler_tasks.start_generation().map_err(|e| {\n                anyhow::anyhow!(\"Failed to start WebSocket handler task generation: {e}\")\n            })?;\n        }\n        let handler_spawner = self.handler_tasks.spawner().map_err(|e| {\n            anyhow::anyhow!(\"Failed to acquire WebSocket handler task spawner: {e}\")\n        })?;\n        let handler_abort = CancellationToken::new();\n        *self.handler_abort.lock() = handler_abort.clone();\n        let mut rollback = ConnectRollback {\n            handler_tasks: Arc::clone(&self.handler_tasks),\n            signal: Arc::clone(&self.signal),\n            handler_abort: handler_abort.clone(),\n            socket_control: self.socket_control.clone(),\n            armed: true,\n        };\n\n        // Reset signal so is_active()/is_closed() work after a previous close()","sourceCodeStart":590,"sourceCodeEnd":626,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/okx/src/websocket/client.rs#L590-L626","documentation":"During OKX WebSocket `connect`, any lingering handler tasks from a previous connection are shut down with deadlines. If `finish_shutdown` fails or times out (a handler task hung and did not end within 2s), the connect fails with this error rather than starting a new generation on top of stuck tasks.","triggerScenarios":"Calling connect (public or private) while a previous connection's handler tasks are still open and one of them fails to terminate within the 2-second shutdown deadline, or the task group reports an internal shutdown error.","commonSituations":"Rapid reconnect loops after network drops; a handler task blocked on an unresponsive send while the socket is half-dead; calling connect twice without awaiting prior teardown.","solutions":["Retry connect after a short backoff; the stuck generation usually ends once the underlying socket times out.","Fully disconnect/close the previous connection before reconnecting instead of calling connect over a live session.","Increase patience between reconnect attempts so handler tasks are not re-entered mid-shutdown."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"// rust\nmatch client.connect().await {\n    Err(e) if e.to_string().contains(\"Previous WebSocket handler failed\") => {\n        tokio::time::sleep(Duration::from_secs(2)).await;\n        client.connect().await?;\n    }\n    other => other?,\n}","preventionTips":["Disconnect fully before reconnecting.","Use a single reconnect supervisor instead of calling connect from multiple tasks.","Apply exponential backoff in reconnect loops."],"tags":["websocket","okx","reconnect","task-shutdown"],"backgroundTag":"invalid-state-transition","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}