{"record":{"id":"bdf984c65aa9a2c6","repo":"nautechsystems/nautilus_trader","slug":"default-client-already-registered-bdf984","errorCode":null,"errorMessage":"default client already registered","messagePattern":"default client already registered","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/execution/src/engine/mod.rs","lineNumber":396,"sourceCode":"    /// Registers a default execution client for fallback routing.\n    pub fn register_default_client(&mut self, client: Box<dyn ExecutionClient>) {\n        let client_id = client.client_id();\n        let adapter = ExecutionClientAdapter::new(client);\n\n        self.clients.insert(client_id, adapter);\n        self.default_client_id = Some(client_id);\n        log::debug!(\"Registered default client {client_id}\");\n    }\n\n    /// Marks an already-registered client as the default for fallback routing.\n    ///\n    /// # Errors\n    ///\n    /// Returns an error if no client is registered with the given ID, or a default\n    /// client has already been set.\n    pub fn set_default_client(&mut self, client_id: ClientId) -> anyhow::Result<()> {\n        if self.default_client_id.is_some() {\n            anyhow::bail!(\"default client already registered\");\n        }\n\n        if !self.clients.contains_key(&client_id) {\n            anyhow::bail!(\"No client registered with ID {client_id}\");\n        }\n        self.default_client_id = Some(client_id);\n        log::debug!(\"Set client {client_id} as default\");\n        Ok(())\n    }\n\n    #[must_use]\n    /// Returns a reference to the execution client registered with the given ID.\n    pub fn get_client(&self, client_id: &ClientId) -> Option<&dyn ExecutionClient> {\n        self.clients.get(client_id).map(|a| a.client.as_ref())\n    }\n\n    #[must_use]\n    /// Returns a mutable reference to the execution client adapter registered with the given ID.","sourceCodeStart":378,"sourceCodeEnd":414,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/execution/src/engine/mod.rs#L378-L414","documentation":"The engine supports at most one default execution client. set_default_client bails with this error if default_client_id is already Some, since reassigning the default client is not allowed through this API.","triggerScenarios":"Calling ExecutionEngine::set_default_client after a default client has already been set in the engine's lifetime (default_client_id.is_some() == true).","commonSituations":"Calling set_default_client twice during node startup (e.g. config-driven setup plus programmatic setup); replacing a default client without first deregistering it; running a test fixture that calls set_default_client per test against a shared engine.","solutions":["Call set_default_client only once per engine instance, before any other default assignment.","If replacement is intended, call deregister_client with the current default's client ID first (tests show deregistering the default clears default_client_id), then set the new default.","Guard the call: only invoke set_default_client when no default has been set yet."],"exampleFix":"// before\nengine.set_default_client(default_id)?;\nengine.set_default_client(new_default_id)?; // bails\n// after\nengine.set_default_client(default_id)?;\nengine.deregister_client(default_id)?;\nengine.set_default_client(new_default_id)?;","handlingStrategy":"validation","validationCode":"// set the default exactly once during engine construction, before any other setup runs\n","typeGuard":null,"tryCatchPattern":"match engine.set_default_client(id) {\n    Err(e) if e.to_string().contains(\"default client already registered\") => {} // keep existing default\n    other => other?,\n}","preventionTips":["Assign the default client in exactly one place in your startup code.","Never call set_default_client in shared fixtures without resetting/rebuilding the engine.","To replace a default, deregister the current default first."],"tags":["execution-engine","default-client","invalid-state","rust"],"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"}