{"record":{"id":"6ae0739adcb1c48b","repo":"nautechsystems/nautilus_trader","slug":"failed-to-send-query-add-position-to-database-mess","errorCode":null,"errorMessage":"Failed to send query add_position to database message handler: {e}","messagePattern":"Failed to send query add_position to database message handler: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/infrastructure/src/sql/cache.rs","lineNumber":968,"sourceCode":"        self.tx.send(query).map_err(|e| {\n            anyhow::anyhow!(\"Failed to send query add_order to database message handler: {e}\")\n        })\n    }\n\n    fn add_order_snapshot(&self, snapshot: &OrderSnapshot) -> anyhow::Result<()> {\n        let query = DatabaseQuery::AddOrderSnapshot(snapshot.to_owned());\n        self.tx.send(query).map_err(|e| {\n            anyhow::anyhow!(\n                \"Failed to send query add_order_snapshot to database message handler: {e}\"\n            )\n        })\n    }\n\n    fn add_position(&self, position: &Position) -> anyhow::Result<()> {\n        let event = position_last_event(position)?;\n        let query = DatabaseQuery::AddPosition(position.id, event);\n        self.tx.send(query).map_err(|e| {\n            anyhow::anyhow!(\"Failed to send query add_position to database message handler: {e}\")\n        })\n    }\n\n    fn add_position_snapshot(&self, snapshot: &PositionSnapshot) -> anyhow::Result<()> {\n        let query = DatabaseQuery::AddPositionSnapshot(snapshot.to_owned());\n        self.tx.send(query).map_err(|e| {\n            anyhow::anyhow!(\n                \"Failed to send query add_position_snapshot to database message handler: {e}\"\n            )\n        })\n    }\n\n    fn add_order_book(&self, _order_book: &OrderBook) -> anyhow::Result<()> {\n        todo!()\n    }\n\n    fn add_quote(&self, quote: &QuoteTick) -> anyhow::Result<()> {\n        let query = DatabaseQuery::AddQuote(quote.to_owned());","sourceCodeStart":950,"sourceCodeEnd":986,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/infrastructure/src/sql/cache.rs#L950-L986","documentation":"Thrown by `add_position` when the `DatabaseQuery::AddPosition` message (position id plus last event) cannot be sent over the mpsc channel because the database message-handler task was dropped. The position is not persisted. `position_last_event(position)` runs first, so SendError is the sole source of this message.","triggerScenarios":"Calling `add_position` when the writer task exited or panicked — adapter stopped, connection task dropped, or process shutting down.","commonSituations":"Persisting position updates after adapter disconnect in live trading; panic in the SQL writer thread.","solutions":["Verify the adapter's message-handler task is running before writing positions.","Inspect logs for receiver-task panics.","Reconnect/restart the adapter and retry.","Fix shutdown ordering so position persistence completes before teardown."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if not cache_db_adapter.is_running:\n    raise RuntimeError(\"Cannot add_position: adapter not running\")","typeGuard":null,"tryCatchPattern":"try:\n    cache.add_position(position)\nexcept RuntimeError as e:\n    logger.error(\"Position persistence failed (writer stopped): %s\", e)","preventionTips":["Keep the adapter connected for the life of the trading session","Flush position updates before teardown","Monitor the SQL writer thread for panics","Reconnect and re-persist on failure"],"tags":["database","channel","position","shutdown"],"backgroundTag":"database-write-failed","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"}