{"record":{"id":"9d9fd778aeb9c5fc","repo":"nautechsystems/nautilus_trader","slug":"polymarket-data-shutdown-failed","errorCode":null,"errorMessage":"Polymarket data shutdown failed: {}","messagePattern":"Polymarket data shutdown failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"crates/adapters/polymarket/src/data/lifecycle.rs","lineNumber":633,"sourceCode":"                    self.config.transport_backend,\n                    self.clock,\n                    self.data_sender.clone(),\n                    self.proxy_url.clone(),\n                    self.rtds_socket_control.clone(),\n                );\n                self.reset_pending = false;\n            }\n\n            self.is_connected\n                .store(false, std::sync::atomic::Ordering::Relaxed);\n            log::info!(\"Disconnected Polymarket data client\");\n        }\n\n        if self.shutdown_errors.is_empty() {\n            Ok(())\n        } else {\n            let errors = std::mem::take(&mut self.shutdown_errors);\n            anyhow::bail!(\"Polymarket data shutdown failed: {}\", errors.join(\"; \"))\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::{\n        cell::RefCell,\n        rc::Rc,\n        sync::{Arc, atomic::Ordering},\n    };\n\n    use nautilus_common::{\n        cache::Cache,\n        clients::{DataClient, ExecutionClient},\n        clock::{Clock, TestClock},\n        live::runner::{replace_data_event_sender, replace_exec_event_sender},\n        messages::{","sourceCodeStart":615,"sourceCodeEnd":651,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/data/lifecycle.rs#L615-L651","documentation":"During Polymarket data-client shutdown, errors accumulated from closing streams/tasks are joined and returned as a single anyhow error prefixed 'Polymarket data shutdown failed:'. disconnect_client surfaces all shutdown problems instead of failing on the first.","triggerScenarios":"Calling disconnect (or a failed connect_client cleanup) when one or more shutdown steps (WS stream close, task abort, subscription cleanup) recorded errors into self.shutdown_errors.","commonSituations":"Network already down when closing WebSockets; underlying tasks already panicked/finished; double disconnect where streams are already closed.","solutions":["Read the joined error message to see which shutdown step failed; each sub-error is separated by '; '","Ensure the client is connected before disconnecting; guard against double disconnect in application code","If caused by network loss at shutdown, treat as benign but verify no reconnect loop is fighting the shutdown","Check logs around shutdown for the originating task/stream errors"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if !client.is_connected() {\n    log::info!(\"client already disconnected; skipping shutdown\");\n    return Ok(());\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = client.disconnect().await {\n    log::warn!(\"shutdown issues (usually benign on network loss): {e}\");\n    // inspect joined sub-errors, ensure no reconnect loop active\n}","preventionTips":["Avoid double-disconnect by tracking connection state","Ensure no background reconnect tasks are running during shutdown","Log full joined error to identify the failing shutdown step"],"tags":["polymarket","shutdown","lifecycle","websocket"],"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-14T05:17:10.506Z"}