fix: N+1 query pattern in event trigger loop (routine_engine) (#1163)

* fix: N+1 query pattern in event trigger loop (routine_engine)

* fix: linter
This commit is contained in:
Nick Pismenkov
2026-03-14 13:06:59 -07:00
committed by GitHub
parent ffe384b66e
commit 994a0b194f
7 changed files with 1211 additions and 5 deletions
+39
View File
@@ -1,5 +1,8 @@
//! PostgreSQL store for persisting agent data.
#[cfg(feature = "postgres")]
use std::collections::HashMap;
use chrono::{DateTime, Utc};
#[cfg(feature = "postgres")]
use deadpool_postgres::{Config, Pool};
@@ -1294,6 +1297,42 @@ impl Store {
Ok(row.get("cnt"))
}
/// Batch-load concurrent run counts for multiple routines in a single query.
/// Returns a map where missing routine IDs default to 0.
#[cfg(feature = "postgres")]
pub async fn count_running_routine_runs_batch(
&self,
routine_ids: &[Uuid],
) -> Result<HashMap<Uuid, i64>, DatabaseError> {
if routine_ids.is_empty() {
return Ok(HashMap::new());
}
let conn = self.conn().await?;
let rows = conn
.query(
"SELECT routine_id, COUNT(*) as cnt FROM routine_runs
WHERE routine_id = ANY($1) AND status = 'running'
GROUP BY routine_id",
&[&routine_ids],
)
.await?;
let mut counts = HashMap::new();
for row in rows {
let id: Uuid = row.get("routine_id");
let cnt: i64 = row.get("cnt");
counts.insert(id, cnt);
}
// Ensure all requested IDs are in the map (defaults to 0 for no running runs)
for id in routine_ids {
counts.entry(*id).or_insert(0);
}
Ok(counts)
}
/// Link a routine run to a dispatched job.
pub async fn link_routine_run_to_job(
&self,