diff --git a/site/frontend/src/pages/compare/compile/table/benchmark-detail.vue b/site/frontend/src/pages/compare/compile/table/benchmark-detail.vue index 4a9f55552..c777df570 100644 --- a/site/frontend/src/pages/compare/compile/table/benchmark-detail.vue +++ b/site/frontend/src/pages/compare/compile/table/benchmark-detail.vue @@ -52,8 +52,8 @@ function detailedQueryLink( commit: ArtifactDescription, baseCommit?: ArtifactDescription ): string { - const {benchmark, profile, scenario} = props.testCase; - let link = `/detailed-query.html?commit=${commit.commit}&benchmark=${benchmark}-${profile}&scenario=${scenario}`; + const {benchmark, profile, scenario, backend, target} = props.testCase; + let link = `/detailed-query.html?commit=${commit.commit}&benchmark=${benchmark}-${profile}&scenario=${scenario}&backend=${backend}&target=${target}`; if (baseCommit !== undefined) { link += `&base_commit=${baseCommit.commit}`; } diff --git a/site/frontend/src/pages/detailed-query/page.vue b/site/frontend/src/pages/detailed-query/page.vue index caf063f04..dc39e48b2 100644 --- a/site/frontend/src/pages/detailed-query/page.vue +++ b/site/frontend/src/pages/detailed-query/page.vue @@ -189,7 +189,7 @@ function storeSortToUrl() { async function loadData() { const params = getUrlParams(); - const {commit, base_commit, benchmark, scenario} = params; + const {commit, base_commit, benchmark, scenario, backend, target} = params; // Load sort state from URL loadSortFromUrl(params); @@ -199,6 +199,8 @@ async function loadData() { base_commit: base_commit ?? null, benchmark, scenario, + backend, + target, }; selector.value = currentSelector; diff --git a/site/frontend/src/pages/detailed-query/utils.ts b/site/frontend/src/pages/detailed-query/utils.ts index b34475012..f8ae4f80f 100644 --- a/site/frontend/src/pages/detailed-query/utils.ts +++ b/site/frontend/src/pages/detailed-query/utils.ts @@ -9,6 +9,8 @@ export interface Selector { base_commit: string | null; benchmark: string; scenario: string; + backend: string; + target: string; } export interface ProfileElement { @@ -100,8 +102,9 @@ export function createTitleData(selector: Selector | null): { let selfHref = ""; if (state.base_commit) { - selfHref = `/detailed-query.html?commit=${state.commit}&scenario=${state.scenario}&benchmark=${state.benchmark}`; - baseHref = `/detailed-query.html?commit=${state.base_commit}&scenario=${state.scenario}&benchmark=${state.benchmark}`; + const args = `&scenario=${state.scenario}&benchmark=${state.benchmark}&backend=${state.backend}&target=${state.target}`; + selfHref = `/detailed-query.html?commit=${state.commit}${args}`; + baseHref = `/detailed-query.html?commit=${state.base_commit}${args}`; } return {text, baseHref, selfHref}; diff --git a/site/src/api.rs b/site/src/api.rs index 3b6e080d1..7ad0e8f3c 100644 --- a/site/src/api.rs +++ b/site/src/api.rs @@ -490,6 +490,12 @@ pub mod self_profile { pub benchmark: String, #[serde(alias = "run_name")] pub scenario: String, + // These fields are kept optional for backwards compatibility + // They can be make required e.g. in 2027 + #[serde(default)] + pub backend: Option, + #[serde(default)] + pub target: Option, } #[derive(Debug, Clone, Serialize)] diff --git a/site/src/request_handlers/self_profile.rs b/site/src/request_handlers/self_profile.rs index 29383fda9..719e605b4 100644 --- a/site/src/request_handlers/self_profile.rs +++ b/site/src/request_handlers/self_profile.rs @@ -5,9 +5,9 @@ use std::time::Instant; use brotli::enc::BrotliEncoderParams; use bytes::Buf; -use database::selector; use database::ArtifactId; use database::{metric::Metric, CommitType}; +use database::{selector, CodegenBackend, Target}; use headers::{ContentType, Header}; use hyper::StatusCode; @@ -461,10 +461,23 @@ pub async fn handle_self_profile( .map_err(|e| format!("invalid run name: {e:?}"))?; let index = ctxt.index.load(); + let backend: CodegenBackend = if let Some(backend) = body.backend { + backend.parse()? + } else { + CodegenBackend::Llvm + }; + let target: Target = if let Some(target) = body.target { + target.parse()? + } else { + Target::X86_64UnknownLinuxGnu + }; + let query = selector::CompileBenchmarkQuery::default() .benchmark(selector::Selector::One(bench_name.to_string())) .profile(selector::Selector::One(profile.parse().unwrap())) .scenario(selector::Selector::One(scenario)) + .backend(selector::Selector::One(backend)) + .target(selector::Selector::One(target)) .metric(selector::Selector::One(Metric::CpuClock)); // Helper for finding an `ArtifactId` based on a commit sha @@ -481,7 +494,12 @@ pub async fn handle_self_profile( let commits = Arc::new(commits); let mut cpu_responses = ctxt.statistic_series(query, commits.clone()).await?; - assert_eq!(cpu_responses.len(), 1, "all selectors are exact"); + if cpu_responses.len() != 1 { + return Err( + "The database query returned multiple results for the given commit. This is a bug." + .to_string(), + ); + } let mut cpu_response = cpu_responses.remove(0).series; let mut self_profile = get_or_download_self_profile(