diff --git a/database/src/lib.rs b/database/src/lib.rs index be409ec13..711ca24fd 100644 --- a/database/src/lib.rs +++ b/database/src/lib.rs @@ -1055,6 +1055,7 @@ impl BenchmarkRequestIndex { /// Contains pending (ArtifactsReady or InProgress) benchmark requests, and a set of their parents /// that are already completed. +#[derive(Debug)] pub struct PendingBenchmarkRequests { pub requests: Vec, pub completed_parent_tags: HashSet, diff --git a/site/src/job_queue/mod.rs b/site/src/job_queue/mod.rs index b728ee1e6..5a2adf58c 100644 --- a/site/src/job_queue/mod.rs +++ b/site/src/job_queue/mod.rs @@ -105,6 +105,7 @@ async fn create_benchmark_request_releases( /// correct queue order, where the first returned request will be the first to be benchmarked next. /// Doesn't consider in-progress requests or release artifacts. fn sort_benchmark_requests(pending: PendingBenchmarkRequests) -> Vec { + log::debug!("Sorting benchmark requests. Pending requests: {pending:?}"); let PendingBenchmarkRequests { requests: mut pending, completed_parent_tags: mut done, @@ -162,6 +163,7 @@ fn sort_benchmark_requests(pending: PendingBenchmarkRequests) -> Vec = pending .requests @@ -575,6 +592,7 @@ mod tests { use crate::job_queue::{build_queue, process_benchmark_requests}; use chrono::Utc; use database::pool::JobEnqueueResult; + use database::tests::builder::CollectorBuilder; use database::tests::run_postgres_test; use database::{ BenchmarkJobConclusion, BenchmarkJobKind, BenchmarkRequest, BenchmarkRequestStatus, @@ -771,6 +789,39 @@ mod tests { .await; } + /// Make sure that queue ordering still works even when all pending requests have a parent + /// that is either also pending or in-progress. + #[tokio::test] + async fn queue_ordering_deps_in_queue() { + run_postgres_test(|mut ctx| async { + ctx.add_collector(CollectorBuilder::default()).await; + + ctx.insert_master_request("parent", "parent2", 1).await; + ctx.complete_request("parent").await; + + // In progress + ctx.insert_master_request("1f88", "parent", 148446).await; + process_benchmark_requests(ctx.db_mut(), &mut vec![]).await?; + + // Artifacts ready + ctx.insert_master_request("5f9d", "2038", 148456).await; + ctx.insert_master_request("90b6", "5f9d", 148462).await; + ctx.insert_try_request(112049).await; + + let db = ctx.db(); + assert!(db + .attach_shas_to_try_benchmark_request(112049, "60ce", "1f88", Utc::now()) + .await + .unwrap()); + ctx.insert_master_request("2038", "1f88", 148350).await; + + let queue = build_queue(db).await?; + queue_order_matches(&queue, &["1f88", "60ce", "2038", "5f9d", "90b6"]); + Ok(ctx) + }) + .await; + } + #[tokio::test] async fn insert_all_jobs() { run_postgres_test(|mut ctx| async {