{"record":{"id":"fe810839f81f9b65","repo":"nautechsystems/nautilus_trader","slug":"failed-to-start-hyperliquid-data-task-generation","errorCode":null,"errorMessage":"Failed to start Hyperliquid data task generation: {e}","messagePattern":"Failed to start Hyperliquid data task generation: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/hyperliquid/src/data.rs","lineNumber":643,"sourceCode":"            // task so its receiver and subscription registries cannot belong\n            // to the previous generation.\n            self.ws_client.begin_shutdown();\n            self.ws_client\n                .disconnect()\n                .await\n                .context(\"failed to tear down Hyperliquid WebSocket before reconnect\")?;\n            self.ws_client.reset_runtime_state();\n            self.abort_session_tasks();\n            self.abort_pending_tasks();\n            let (session_result, pending_result) =\n                tokio::join!(self.await_session_tasks(), self.await_pending_tasks());\n            session_result?;\n            pending_result?;\n            self.session_tasks.start_generation().map_err(|e| {\n                anyhow::anyhow!(\"Failed to start Hyperliquid data session generation: {e}\")\n            })?;\n            self.pending_tasks.start_generation().map_err(|e| {\n                anyhow::anyhow!(\"Failed to start Hyperliquid data task generation: {e}\")\n            })?;\n            self.cancellation_token = CancellationToken::new();\n        }\n        let cancellation_token = self.cancellation_token.clone();\n        let ws_client = self.ws_client.clone();\n        let setup_guard =\n            TaskGroupGuard::new(&[&self.session_tasks, &self.pending_tasks], move || {\n                cancellation_token.cancel();\n                ws_client.begin_shutdown();\n            });\n\n        register_hyperliquid_custom_data();\n\n        let instruments = self\n            .bootstrap_instruments()\n            .await\n            .context(\"failed to bootstrap instruments\")?;\n","sourceCodeStart":625,"sourceCodeEnd":661,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/hyperliquid/src/data.rs#L625-L661","documentation":"Same connect sequence as error 3102 but for the `pending_tasks` manager: `pending_tasks.start_generation()` failed while starting a new generation of background (pending) data tasks. Connect aborts with this error after the session generation already started, leaving the client not fully connected.","triggerScenarios":"Calling connect when the pending-task registry cannot start a new generation — stale generation state from an incomplete previous shutdown, or concurrent connect/teardown racing on the same client.","commonSituations":"Rapid reconnect loops in a supervisor; calling connect while a previous disconnect's `await_pending_tasks` was still timing out; sharing one client across tasks.","solutions":["Ensure full teardown before reconnecting (await disconnect to completion).","Serialize the connect/disconnect lifecycle; never interleave them.","Recreate the data client if the task manager remains in a bad state.","Check logs for the earlier pending-task shutdown error that left the stale state."],"exampleFix":"// before\nlet _ = client.disconnect().await; // ignoring incomplete teardown\nclient.connect().await?;\n// after\nclient.disconnect().await?; // propagate teardown errors first\nclient.connect().await?;","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// serialize lifecycle; on pending-generation failure, tear down and retry once\nif let Err(e) = client.connect().await {\n    if e.to_string().contains(\"task generation\") {\n        let _ = client.disconnect().await;\n        tokio::time::sleep(Duration::from_millis(500)).await;\n        client.connect().await?;\n    } else {\n        return Err(e);\n    }\n}","preventionTips":["Do not interleave connect/disconnect calls; run them sequentially in one owner task.","Handle earlier pending-task shutdown errors instead of ignoring disconnect results.","Use a fresh client instance if task-manager state appears corrupted."],"tags":["websocket","connect","lifecycle","async","hyperliquid"],"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"}