{"record":{"id":"934af7b4f107e935","repo":"nautechsystems/nautilus_trader","slug":"failed-to-register-coinbase-websocket-consumption-934af7","errorCode":null,"errorMessage":"failed to register Coinbase WebSocket consumption task","messagePattern":"failed to register Coinbase WebSocket consumption task","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/coinbase/src/data/mod.rs","lineNumber":303,"sourceCode":"                                log::debug!(\"WebSocket output channel closed\");\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n\n            log::debug!(\"Coinbase WebSocket consumption loop finished\");\n        };\n\n        if let Err(e) = self.session_tasks.spawn(future) {\n            if let Err(shutdown_error) = self.ws_client.disconnect().await {\n                return Err(anyhow::Error::new(e).context(format!(\n                    \"failed to register Coinbase WebSocket consumption task; startup rollback \\\n                     failed: {shutdown_error}\"\n                )));\n            }\n            return Err(anyhow::Error::new(e)\n                .context(\"failed to register Coinbase WebSocket consumption task\"));\n        }\n        log::debug!(\"WebSocket consumption task registered\");\n        Ok(())\n    }\n\n    async fn teardown_partial_connect(&mut self) -> anyhow::Result<()> {\n        self.cancellation_token.cancel();\n        self.session_tasks.begin_shutdown();\n        self.command_tasks.begin_shutdown();\n        self.deriv_polls.shutdown();\n        self.ws_client.begin_shutdown();\n\n        let (tasks_result, polls_result) =\n            tokio::join!(self.finish_tasks(), self.deriv_polls.finish_shutdown());\n\n        if let Err(e) = tasks_result {\n            self.shutdown_errors.push(e.to_string());","sourceCodeStart":285,"sourceCodeEnd":321,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/coinbase/src/data/mod.rs#L285-L321","documentation":"This error is returned by spawn_ws when the Coinbase WebSocket consumption task fails to register with the session task spawner, but the rollback disconnect (ws_client.disconnect()) succeeded. The original spawn error is the source; the context indicates the startup was cleanly rolled back — no lingering connection should remain. It surfaces from connect().","triggerScenarios":"session_tasks.spawn(future) returns Err (closed/aborted task group, runtime shutdown) while self.ws_client.disconnect().await succeeds.","commonSituations":"Connecting a Coinbase data client after its session task group was dropped; tokio runtime cancellation during startup; calling connect() concurrently with shutdown; lifecycle misuse of the live data client.","solutions":["Fix client lifecycle: create and connect the client within a live session scope, don't reuse after shutdown","Check the chained spawn error source for the task-group failure reason","Ensure the tokio runtime is alive and not being torn down during connect()","Retry connect() with a freshly constructed data client","Look for concurrent connect/shutdown calls racing on the same client"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Guard: only connect a client with a live session and runtime\nif session_is_closed() || runtime_is_shutting_down() {\n    return Err(anyhow!(\"refusing to connect Coinbase data client during shutdown\"));\n}","typeGuard":"fn is_clean_rollback(err: &anyhow::Error) -> bool {\n    err.to_string().contains(\"failed to register Coinbase WebSocket consumption task\")\n        && !err.to_string().contains(\"startup rollback failed\")\n}","tryCatchPattern":"match connect(client).await {\n    Err(e) if is_clean_rollback(&e) => {\n        // spawn failed but disconnect succeeded: safe to retry with fresh client\n        retry_with_backoff(|| connect(new_client())).await\n    }\n    other => other,\n}","preventionTips":["Create and connect data clients strictly within the live session lifecycle","Don't reuse clients after their session task group is dropped","Check the chained spawn error to diagnose task-group closure","Serialize connect/shutdown operations on the same client"],"tags":["websocket","coinbase","task-spawn","startup"],"backgroundTag":"websocket-connect-failed","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}