nautechsystems/nautilus_trader · error
Failed to send query index_order_clients to database message
Error message
Failed to send query index_order_clients to database message handler: {e} What it means
index_order_clients batches (ClientOrderId, ClientId) claims into DatabaseQuery::IndexOrderClients and sends them over self.tx to the database message handler; a send failure is wrapped in this error. An empty claims slice returns Ok early, so the only failure is a closed channel — the handler task has been dropped. The mapping is never persisted when this fires.
Source
Thrown at crates/infrastructure/src/sql/cache.rs:1243
client_order_id: ClientOrderId,
position_id: PositionId,
) -> anyhow::Result<()> {
let query = DatabaseQuery::IndexOrderPosition(client_order_id, position_id);
self.tx.send(query).map_err(|e| {
anyhow::anyhow!(
"Failed to send query index_order_position to database message handler: {e}"
)
})
}
fn index_order_clients(&self, claims: &[(ClientOrderId, ClientId)]) -> anyhow::Result<()> {
if claims.is_empty() {
return Ok(());
}
let query = DatabaseQuery::IndexOrderClients(claims.to_vec());
self.tx.send(query).map_err(|e| {
anyhow::anyhow!(
"Failed to send query index_order_clients to database message handler: {e}"
)
})
}
fn update_actor(
&self,
actor_id: &ActorId,
_state: &AHashMap<String, Bytes>,
) -> anyhow::Result<()> {
anyhow::bail!("update_actor not implemented for PostgreSQL cache adapter: {actor_id}")
}
fn update_strategy(
&self,
strategy_id: &StrategyId,
_state: &AHashMap<String, Bytes>,
) -> anyhow::Result<()> {View on GitHub (pinned to 18893faf8b)
Solutions
- Confirm the cache handler task is alive before index updates
- Rebuild the adapter if it was shut down; do not reuse closed instances
- Fix the handler's original failure from logs
- Treat this as critical in live trading: order→client mappings lost here affect later lookups
Defensive patterns
Strategy: try-catch
Try / catch
if let Err(e) = cache.index_order_clients(&claims) {
tracing::error!("order-client indexing failed: {e:#}");
return Err(e.into());
} Prevention
- Never reuse a cache adapter after its handler task has been dropped
- Check handler liveness before batch index updates
- Investigate any prior handler panic — it closes the channel for all later calls
- Order shutdown: engine stops indexing, then adapter drops
When it happens
Trigger: Calling index_order_clients with a non-empty claims slice after the handler task exited (shutdown, abort, or handler init failure).
Common situations: Adapter shutdown racing with execution engine index updates; handler crash from a prior failed query; stale adapter references after reconnect.
Related errors
- Failed to send query add_quote to database message handler:
- Failed to send query add_trade to database message handler:
- Failed to send query add_bar to database message handler: {e
- Failed to send query add_signal to database message handler:
- Failed to send query index_order_position to database messag
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/191b9ea2cbe09805.
Report an issue: GitHub.