Skip to content

Commit d4f7289

Browse files
authored
Merge pull request #2217 from Jamesbarford/feat/status-page-queries
Feat; status page queries
2 parents 75137f2 + 568df19 commit d4f7289

File tree

4 files changed

+531
-75
lines changed

4 files changed

+531
-75
lines changed

database/src/lib.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,10 @@ impl BenchmarkJob {
11581158
pub fn deque_count(&self) -> u32 {
11591159
self.deque_counter
11601160
}
1161+
1162+
pub fn status(&self) -> &BenchmarkJobStatus {
1163+
&self.status
1164+
}
11611165
}
11621166

11631167
/// Describes the final state of a job
@@ -1212,3 +1216,11 @@ impl CollectorConfig {
12121216
self.date_added
12131217
}
12141218
}
1219+
1220+
/// The data that can be retrived from the database directly to populate the
1221+
/// status page
1222+
#[derive(Debug, PartialEq)]
1223+
pub struct PartialStatusPageData {
1224+
pub completed_requests: Vec<(BenchmarkRequest, String, Vec<String>)>,
1225+
pub in_progress: Vec<(BenchmarkRequest, Vec<BenchmarkJob>)>,
1226+
}

database/src/pool.rs

Lines changed: 140 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::selector::CompileTestCase;
22
use crate::{
33
ArtifactCollection, ArtifactId, ArtifactIdNumber, BenchmarkJob, BenchmarkJobConclusion,
44
BenchmarkRequest, BenchmarkRequestIndex, BenchmarkRequestStatus, BenchmarkSet, CodegenBackend,
5-
CollectorConfig, CompileBenchmark, Target,
5+
CollectorConfig, CompileBenchmark, PartialStatusPageData, Target,
66
};
77
use crate::{CollectionId, Index, Profile, QueuedCommit, Scenario, Step};
88
use chrono::{DateTime, Utc};
@@ -271,6 +271,8 @@ pub trait Connection: Send + Sync {
271271
id: u32,
272272
benchmark_job_conculsion: BenchmarkJobConclusion,
273273
) -> anyhow::Result<()>;
274+
275+
async fn get_status_page_data(&self) -> anyhow::Result<PartialStatusPageData>;
274276
}
275277

276278
#[async_trait::async_trait]
@@ -393,6 +395,7 @@ mod tests {
393395
use super::*;
394396
use crate::metric::Metric;
395397
use crate::tests::run_postgres_test;
398+
use crate::BenchmarkJobStatus;
396399
use crate::{tests::run_db_test, BenchmarkRequestType, Commit, CommitType, Date};
397400
use chrono::Utc;
398401
use std::str::FromStr;
@@ -977,6 +980,142 @@ mod tests {
977980
let completed = db.load_benchmark_request_index().await.unwrap();
978981

979982
assert!(completed.contains_tag("sha-1"));
983+
Ok(ctx)
984+
})
985+
.await;
986+
}
987+
988+
#[tokio::test]
989+
async fn get_status_page_data() {
990+
run_postgres_test(|ctx| async {
991+
let db = ctx.db_client().connection().await;
992+
let benchmark_set = BenchmarkSet(0u32);
993+
let time = chrono::DateTime::from_str("2021-09-01T00:00:00.000Z").unwrap();
994+
let tag = "sha-1";
995+
let tag_two = "sha-2";
996+
let collector_name = "collector-1";
997+
let target = Target::X86_64UnknownLinuxGnu;
998+
999+
db.add_collector_config(collector_name, target, benchmark_set.0, true)
1000+
.await
1001+
.unwrap();
1002+
1003+
let benchmark_request = BenchmarkRequest::create_release(tag, time);
1004+
db.insert_benchmark_request(&benchmark_request)
1005+
.await
1006+
.unwrap();
1007+
1008+
complete_request(&*db, tag, collector_name, benchmark_set.0, target).await;
1009+
// record a couple of errors against the tag
1010+
let artifact_id = db.artifact_id(&ArtifactId::Tag(tag.to_string())).await;
1011+
1012+
db.record_error(artifact_id, "example-1", "This is an error")
1013+
.await;
1014+
db.record_error(artifact_id, "example-2", "This is another error")
1015+
.await;
1016+
1017+
let benchmark_request_two = BenchmarkRequest::create_release(tag_two, time);
1018+
db.insert_benchmark_request(&benchmark_request_two)
1019+
.await
1020+
.unwrap();
1021+
1022+
db.enqueue_benchmark_job(
1023+
benchmark_request_two.tag().unwrap(),
1024+
target,
1025+
CodegenBackend::Llvm,
1026+
Profile::Opt,
1027+
benchmark_set.0,
1028+
)
1029+
.await
1030+
.unwrap();
1031+
db.enqueue_benchmark_job(
1032+
benchmark_request_two.tag().unwrap(),
1033+
target,
1034+
CodegenBackend::Llvm,
1035+
Profile::Debug,
1036+
benchmark_set.0,
1037+
)
1038+
.await
1039+
.unwrap();
1040+
1041+
db.update_benchmark_request_status(
1042+
benchmark_request_two.tag().unwrap(),
1043+
BenchmarkRequestStatus::InProgress,
1044+
)
1045+
.await
1046+
.unwrap();
1047+
1048+
let status_page_data = db.get_status_page_data().await.unwrap();
1049+
1050+
assert!(status_page_data.completed_requests.len() == 1);
1051+
assert_eq!(status_page_data.completed_requests[0].0.tag().unwrap(), tag);
1052+
assert!(matches!(
1053+
status_page_data.completed_requests[0].0.status(),
1054+
BenchmarkRequestStatus::Completed { .. }
1055+
));
1056+
// can't really test duration
1057+
// ensure errors are correct
1058+
assert_eq!(
1059+
status_page_data.completed_requests[0].2[0],
1060+
"This is an error".to_string()
1061+
);
1062+
assert_eq!(
1063+
status_page_data.completed_requests[0].2[1],
1064+
"This is another error".to_string()
1065+
);
1066+
1067+
assert!(status_page_data.in_progress.len() == 1);
1068+
// we should have 2 jobs
1069+
assert!(status_page_data.in_progress[0].1.len() == 2);
1070+
// the request should be in progress
1071+
assert!(matches!(
1072+
status_page_data.in_progress[0].0.status(),
1073+
BenchmarkRequestStatus::InProgress
1074+
));
1075+
1076+
// Test the first job
1077+
assert!(matches!(
1078+
status_page_data.in_progress[0].1[0].target(),
1079+
Target::X86_64UnknownLinuxGnu
1080+
));
1081+
assert!(matches!(
1082+
status_page_data.in_progress[0].1[0].status(),
1083+
BenchmarkJobStatus::Queued
1084+
));
1085+
assert!(matches!(
1086+
status_page_data.in_progress[0].1[0].backend(),
1087+
CodegenBackend::Llvm
1088+
));
1089+
assert!(matches!(
1090+
status_page_data.in_progress[0].1[0].profile(),
1091+
Profile::Opt
1092+
));
1093+
assert_eq!(
1094+
status_page_data.in_progress[0].1[0].benchmark_set(),
1095+
benchmark_set
1096+
);
1097+
1098+
// test the second job
1099+
assert!(matches!(
1100+
status_page_data.in_progress[0].1[1].target(),
1101+
Target::X86_64UnknownLinuxGnu
1102+
));
1103+
assert!(matches!(
1104+
status_page_data.in_progress[0].1[1].status(),
1105+
BenchmarkJobStatus::Queued
1106+
));
1107+
assert!(matches!(
1108+
status_page_data.in_progress[0].1[1].backend(),
1109+
CodegenBackend::Llvm
1110+
));
1111+
assert!(matches!(
1112+
status_page_data.in_progress[0].1[1].profile(),
1113+
Profile::Debug
1114+
));
1115+
assert_eq!(
1116+
status_page_data.in_progress[0].1[1].benchmark_set(),
1117+
benchmark_set
1118+
);
9801119

9811120
Ok(ctx)
9821121
})

0 commit comments

Comments
 (0)