{"record":{"id":"45235f279730cccf","repo":"nautechsystems/nautilus_trader","slug":"failed-to-get-pool-last-synced-block-e","errorCode":null,"errorMessage":"Failed to get pool last synced block: {e}","messagePattern":"Failed to get pool last synced block: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/cache/database.rs","lineNumber":1550,"sourceCode":"        dex: &DexType,\n        pool_identifier: &PoolIdentifier,\n    ) -> anyhow::Result<Option<u64>> {\n        let result = sqlx::query_as::<_, (Option<i64>,)>(\n            \"\n            SELECT\n                last_full_sync_block_number\n            FROM pool\n            WHERE chain_id = $1\n            AND dex_name = $2\n            AND pool_identifier = $3\n            \",\n        )\n        .bind(chain_id as i32)\n        .bind(dex.to_string())\n        .bind(pool_identifier.as_ref())\n        .fetch_optional(&self.pool)\n        .await\n        .map_err(|e| anyhow::anyhow!(\"Failed to get pool last synced block: {e}\"))?;\n\n        Ok(result.and_then(|(block_number,)| block_number.map(|b| b as u64)))\n    }\n\n    pub(crate) async fn get_pool_event_sync_state(\n        &self,\n        chain_id: u32,\n        dex: &DexType,\n        pool_identifier: &PoolIdentifier,\n    ) -> anyhow::Result<PoolEventSyncState> {\n        let pool_state = sqlx::query_as::<_, (i32, Option<i64>)>(\n            \"\n            SELECT event_sync_version, last_full_sync_block_number\n            FROM pool\n            WHERE chain_id = $1\n            AND dex_name = $2\n            AND pool_identifier = $3\n            \",","sourceCodeStart":1532,"sourceCodeEnd":1568,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/cache/database.rs#L1532-L1568","documentation":"Wraps a sqlx error from the SELECT reading the last synced block for a specific pool. It fires only on query failure; an absent row yields Ok(None) so callers can start from genesis or a configured start block.","triggerScenarios":"Calling `get_pool_last_synced_block(chain_id, dex, pool_identifier)` when the connection fails, the checkpoint table is missing, or the query times out or errors on the server side.","commonSituations":"Missing migrations on fresh environments; DB failover mid-indexing; connection pool exhausted by concurrent sync tasks.","solutions":["Apply pending migrations so the pool checkpoint table exists","Check pool exhaustion (max_connections) if errors appear under concurrent load","Retry the read; it is idempotent","Inspect the wrapped sqlx error for the server-side cause"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"sqlx::query(\"SELECT 1 FROM pool_sync_checkpoints LIMIT 1\").fetch_optional(&pool).await?;","typeGuard":null,"tryCatchPattern":"let last_block = get_pool_last_synced_block(chain_id, dex, pool_id)\n    .await\n    .unwrap_or(None)\n    .unwrap_or(start_block);","preventionTips":["Fall back to genesis/configured start block on read failure","Cap connection-pool concurrency to avoid exhaustion","Run migrations before syncing"],"tags":["database","sqlx","read-failure","sync-checkpoint"],"backgroundTag":"sql-query-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"}