{"record":{"id":"8b7aee3652ec4a03","repo":"nautechsystems/nautilus_trader","slug":"polymarket-session-task-admission-is-closed-e","errorCode":null,"errorMessage":"Polymarket session task admission is closed: {e}","messagePattern":"Polymarket session task admission is closed: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/polymarket/src/execution/lifecycle.rs","lineNumber":319,"sourceCode":"        let http_client = self.http_client.clone();\n        let clock = self.clock;\n        let signature_type = self.config.signature_type;\n        let stopping = self.stopping.clone();\n        let user_address = self\n            .secrets\n            .funder\n            .clone()\n            .unwrap_or_else(|| self.secrets.address.clone());\n        let user_api_key = SecretString::from(self.secrets.credential.api_key_str().to_string());\n\n        let fill_tracker = self.fill_tracker.clone();\n        let pending_submits = self.pending_submits.clone();\n        let order_contexts = self.order_contexts.clone();\n        let ws_dispatch_state = self.ws_dispatch_state.clone();\n        let session_spawner = self\n            .session_tasks\n            .spawner()\n            .map_err(|e| anyhow::anyhow!(\"Polymarket session task admission is closed: {e}\"))?;\n\n        if let Err(e) = self.session_tasks.spawn(async move {\n            let ctx = WsDispatchContext {\n                token_instruments: &token_instruments,\n                fill_tracker: &fill_tracker,\n                pending_submits: &pending_submits,\n                order_contexts: &order_contexts,\n                emitter: &emitter,\n                account_id,\n                clock,\n                user_address: &user_address,\n                user_api_key: user_api_key.expose_secret(),\n            };\n\n            loop {\n                match rx.recv().await {\n                    Some(PolymarketWsMessage::User(user_msg)) => {\n                        let refresh = {","sourceCodeStart":301,"sourceCodeEnd":337,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/polymarket/src/execution/lifecycle.rs#L301-L337","documentation":"Before spawning the WebSocket dispatch task, `start_ws_stream` acquires a spawner from the `session_tasks` task group. If the task group's admission is closed (shutdown has begun), `spawner()` fails and this error is returned. It means the adapter is shutting down or not yet restarted for a new generation, so no new session tasks can be admitted.","triggerScenarios":"Calling connect_client after await_session_tasks/begin_shutdown has closed session-task admission and before start_generation reopens it; a racing teardown closing the group while connect is in progress.","commonSituations":"Concurrent connect and disconnect calls on the execution client; reconnect attempt issued during adapter shutdown; stop flag set while a connect is still completing.","solutions":["Do not call connect while the client is stopping; check the stopping flag/state before connecting","Ensure connect_client's start_generation path runs (reopening admission) before spawning session tasks","Serialize connect/disconnect calls behind a lock or the existing setup_guard","Retry connect after the shutdown generation has fully finished"],"exampleFix":"// before: connecting during shutdown\nif stopping { return; }\nadapter.connect().await?;\n// after: guard against closed admission with proper lifecycle ordering\nif adapter.is_stopping() {\n    return; // refuse connect during teardown\n}\nadapter.connect().await?;","handlingStrategy":"try-catch","validationCode":"// refuse connect while adapter is stopping\nif adapter.is_stopping() { return Err(anyhow!(\"cannot connect during shutdown\")); }","typeGuard":null,"tryCatchPattern":"match adapter.connect().await {\n    Err(e) if e.to_string().contains(\"admission is closed\") => {\n        // wait for shutdown generation to finish, then retry\n        tokio::time::sleep(Duration::from_secs(1)).await;\n    }\n    other => other?,\n}","preventionTips":["Do not interleave connect and disconnect concurrently","Check the stopping flag/state before connecting","Await full teardown completion before reconnect attempts"],"tags":["rust","async","lifecycle","concurrency"],"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"}