{"record":{"id":"e2c69cf42835a702","repo":"nautechsystems/nautilus_trader","slug":"error-e2c69c","errorCode":null,"errorMessage":"{}","messagePattern":"\\{\\}","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/live/src/node/mod.rs","lineNumber":2265,"sourceCode":"\n        let mut errors = Vec::new();\n\n        if let Err(e) = controller_stop_result {\n            errors.push(format!(\"Failed to stop plug-in controllers: {e}\"));\n        }\n\n        if let Err(e) = trader_stop_result {\n            errors.push(format!(\"Failed to stop trader: {e}\"));\n        }\n\n        if let Err(e) = finalize_result {\n            errors.push(format!(\"Failed to finalize startup abort: {e}\"));\n        }\n\n        if errors.is_empty() {\n            Ok(())\n        } else {\n            anyhow::bail!(\"{}\", errors.join(\"; \"))\n        }\n    }\n\n    async fn process_receivers_for(\n        &mut self,\n        duration: Duration,\n        receivers: &mut RunnerReceivers<'_>,\n    ) -> usize {\n        let deadline = dst::time::Instant::now() + duration;\n        let mut processed = 0;\n\n        loop {\n            tokio::select! {\n                biased;\n\n                () = dst::time::sleep_until(deadline) => break,\n                Some(message) = receivers.time_evt.recv() => {\n                    let _ = AsyncRunner::handle_time_event(message);","sourceCodeStart":2247,"sourceCodeEnd":2283,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/live/src/node/mod.rs#L2247-L2283","documentation":"abort_started_trader rolls back a trader that was partially started; any errors encountered while aborting are collected, joined with '; ', and returned as a single anyhow error. The message is entirely composed of the accumulated cleanup failures.","triggerScenarios":"finish_startup_trader encounters a startup failure after the trader has begun starting, then abort_started_trader runs and one or more of its cleanup steps (stopping components, finalizing abort) each push errors into the errors vec.","commonSituations":"Partial-start failures such as an actor/strategy failing during start, combined with cleanup steps that also fail (e.g. stopping an engine already in a bad state, connection teardown errors).","solutions":["Parse the '; '-joined message: each segment is one distinct cleanup failure","Fix the underlying reason the trader needed aborting in the first place","Address each listed cleanup failure (often ordering/double-stop issues)","Add logging around the abort steps to pinpoint which step failed"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if let Err(e) = node.finish_startup_trader().await {\n    for seg in e.to_string().split(\"; \") {\n        tracing::error!(abort_error = seg, \"startup abort failure segment\");\n    }\n}","preventionTips":["Keep cleanup paths idempotent so partial aborts can be retried","Avoid double-stopping traders/engines during abort","Add tracing to abort steps to identify which one fails"],"tags":["rust","startup","live-node","cleanup","aggregated-errors"],"backgroundTag":"internal-invariant-violation","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"}