Skip to content

Commit 0f81ee0

Browse files
authored
Merge pull request #2340 from Kobzol/benchmark-set-robust
Make benchmark set and job operations a bit more robust
2 parents 8be452a + c62b408 commit 0f81ee0

File tree

4 files changed

+52
-44
lines changed

4 files changed

+52
-44
lines changed

collector/src/benchmark_set/compile_benchmarks.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! This file contains an exhaustive list of all compile-time benchmarks
22
//! located in the `collector/compile-benchmarks` directory that are benchmarked in production.
33
//! If new benchmarks are added/removed, they have to also be added/removed here, and in
4-
//! the [super::expand_benchmark_set] function.
4+
//! the [super::get_benchmark_sets_for_target] function.
55
66
// Stable benchmarks
77
pub(super) const CARGO: &str = "cargo";

collector/src/benchmark_set/mod.rs

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,31 @@ pub enum BenchmarkSetMember {
3131
CompileBenchmark(BenchmarkName),
3232
}
3333

34-
/// Return the number of benchmark sets for the given target.
35-
pub fn benchmark_set_count(target: Target) -> usize {
36-
match target {
37-
Target::X86_64UnknownLinuxGnu => 1,
34+
#[derive(Debug)]
35+
pub struct BenchmarkSet {
36+
members: Vec<BenchmarkSetMember>,
37+
}
38+
39+
impl BenchmarkSet {
40+
pub fn members(&self) -> &[BenchmarkSetMember] {
41+
&self.members
3842
}
3943
}
4044

41-
/// Expand all the benchmarks that should be performed by a single collector.
42-
pub fn expand_benchmark_set(id: BenchmarkSetId) -> Vec<BenchmarkSetMember> {
45+
pub const BENCHMARK_SET_RUNTIME_BENCHMARKS: u32 = 0;
46+
pub const BENCHMARK_SET_RUSTC: u32 = 0;
47+
48+
/// Return all benchmark sets for the given target.
49+
pub fn get_benchmark_sets_for_target(target: Target) -> Vec<BenchmarkSet> {
4350
use compile_benchmarks::*;
4451

45-
match (id.target, id.index) {
46-
(Target::X86_64UnknownLinuxGnu, 0) => {
47-
vec![
52+
fn compile(name: &str) -> BenchmarkSetMember {
53+
BenchmarkSetMember::CompileBenchmark(BenchmarkName::from(name))
54+
}
55+
56+
match target {
57+
Target::X86_64UnknownLinuxGnu => {
58+
let all = vec![
4859
compile(AWAIT_CALL_TREE),
4960
compile(BITMAPS_3_2_1),
5061
compile(BITMAPS_3_2_1_NEW_SOLVER),
@@ -106,24 +117,21 @@ pub fn expand_benchmark_set(id: BenchmarkSetId) -> Vec<BenchmarkSetMember> {
106117
compile(UNUSED_WARNINGS),
107118
compile(WF_PROJECTION_STRESS_65510),
108119
compile(WG_GRAMMAR),
109-
]
110-
}
111-
(Target::X86_64UnknownLinuxGnu, 1..) => {
112-
panic!("Unknown benchmark set id {id:?}");
120+
];
121+
vec![BenchmarkSet { members: all }]
113122
}
114123
}
115124
}
116125

117-
/// Helper function for creating compile-time benchmark member sets.
118-
fn compile(name: &str) -> BenchmarkSetMember {
119-
BenchmarkSetMember::CompileBenchmark(BenchmarkName::from(name))
126+
/// Expand all the benchmarks that should be performed by a single collector.
127+
pub fn get_benchmark_set(id: BenchmarkSetId) -> BenchmarkSet {
128+
let mut sets = get_benchmark_sets_for_target(id.target);
129+
sets.remove(id.index as usize)
120130
}
121131

122132
#[cfg(test)]
123133
mod tests {
124-
use crate::benchmark_set::{
125-
benchmark_set_count, expand_benchmark_set, BenchmarkSetId, BenchmarkSetMember,
126-
};
134+
use crate::benchmark_set::{get_benchmark_sets_for_target, BenchmarkSetMember};
127135
use crate::compile::benchmark::target::Target;
128136
use crate::compile::benchmark::{
129137
get_compile_benchmarks, BenchmarkName, CompileBenchmarkFilter,
@@ -135,21 +143,13 @@ mod tests {
135143
/// complete, i.e. they don't miss any benchmarks.
136144
#[test]
137145
fn check_benchmark_set_x64() {
138-
let target = Target::X86_64UnknownLinuxGnu;
139-
let sets = (0..benchmark_set_count(target))
140-
.map(|index| {
141-
expand_benchmark_set(BenchmarkSetId {
142-
target,
143-
index: index as u32,
144-
})
145-
})
146-
.collect::<Vec<Vec<BenchmarkSetMember>>>();
146+
let sets = get_benchmark_sets_for_target(Target::X86_64UnknownLinuxGnu);
147147

148148
// Assert set is unique
149149
for set in &sets {
150-
let hashset = set.iter().collect::<HashSet<_>>();
150+
let hashset = set.members().iter().collect::<HashSet<_>>();
151151
assert_eq!(
152-
set.len(),
152+
set.members().len(),
153153
hashset.len(),
154154
"Benchmark set {set:?} contains duplicates"
155155
);
@@ -160,8 +160,8 @@ mod tests {
160160
for j in i + 1..sets.len() {
161161
let set_a = &sets[i];
162162
let set_b = &sets[j];
163-
let hashset_a = set_a.iter().collect::<HashSet<_>>();
164-
let hashset_b = set_b.iter().collect::<HashSet<_>>();
163+
let hashset_a = set_a.members().iter().collect::<HashSet<_>>();
164+
let hashset_b = set_b.members().iter().collect::<HashSet<_>>();
165165
assert!(
166166
hashset_a.is_disjoint(&hashset_b),
167167
"Benchmark sets {set_a:?} and {set_b:?} overlap"
@@ -170,7 +170,10 @@ mod tests {
170170
}
171171

172172
// Check that the union of all sets contains all the required benchmarks
173-
let all_members = sets.iter().flatten().collect::<HashSet<_>>();
173+
let all_members = sets
174+
.iter()
175+
.flat_map(|s| s.members())
176+
.collect::<HashSet<_>>();
174177

175178
const BENCHMARK_DIR: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/compile-benchmarks");
176179
let all_compile_benchmarks =
@@ -189,7 +192,7 @@ mod tests {
189192
let BenchmarkSetMember::CompileBenchmark(name) = benchmark;
190193
assert!(
191194
all_compile_benchmarks.contains(name),
192-
"Compile-time benchmark {name} does not exist on disk or is a stable benchmark"
195+
"Compile-time benchmark {name} does not exist on disk"
193196
);
194197
}
195198
assert_eq!(all_members.len(), all_compile_benchmarks.len());

collector/src/bin/collector.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use collector::api::next_artifact::NextArtifact;
3434
use collector::artifact_stats::{
3535
compile_and_get_stats, ArtifactStats, ArtifactWithStats, CargoProfile,
3636
};
37-
use collector::benchmark_set::{expand_benchmark_set, BenchmarkSetId, BenchmarkSetMember};
37+
use collector::benchmark_set::{get_benchmark_set, BenchmarkSetId, BenchmarkSetMember};
3838
use collector::codegen::{codegen_diff, CodegenType};
3939
use collector::compile::benchmark::category::Category;
4040
use collector::compile::benchmark::codegen_backend::CodegenBackend;
@@ -1777,9 +1777,12 @@ async fn create_benchmark_configs(
17771777
Option<RuntimeBenchmarkConfig>,
17781778
)> {
17791779
// Expand the benchmark set and figure out which benchmarks should be executed
1780-
let benchmark_set = BenchmarkSetId::new(job.target().into(), job.benchmark_set().get_id());
1781-
let benchmark_set_members = expand_benchmark_set(benchmark_set);
1782-
log::debug!("Expanded benchmark set members: {benchmark_set_members:?}");
1780+
let benchmark_set_id = BenchmarkSetId::new(job.target().into(), job.benchmark_set().get_id());
1781+
let benchmark_set = get_benchmark_set(benchmark_set_id);
1782+
log::debug!(
1783+
"Expanded benchmark set members: {:?}",
1784+
benchmark_set.members()
1785+
);
17831786

17841787
let mut bench_rustc = false;
17851788
let mut bench_runtime = false;
@@ -1795,7 +1798,7 @@ async fn create_benchmark_configs(
17951798
bench_runtime = true;
17961799
}
17971800
database::BenchmarkJobKind::Compiletime => {
1798-
for member in benchmark_set_members {
1801+
for member in benchmark_set.members() {
17991802
match member {
18001803
BenchmarkSetMember::CompileBenchmark(benchmark) => {
18011804
bench_compile_benchmarks.insert(benchmark);

site/src/job_queue/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ use crate::job_queue::utils::{parse_release_string, ExtractIf};
55
use crate::load::{partition_in_place, SiteCtxt};
66
use anyhow::Context;
77
use chrono::Utc;
8-
use collector::benchmark_set::benchmark_set_count;
8+
use collector::benchmark_set::{
9+
get_benchmark_sets_for_target, BENCHMARK_SET_RUNTIME_BENCHMARKS, BENCHMARK_SET_RUSTC,
10+
};
911
use database::pool::{JobEnqueueResult, Transaction};
1012
use database::{
1113
BenchmarkJobKind, BenchmarkRequest, BenchmarkRequestIndex, BenchmarkRequestInsertResult,
@@ -317,7 +319,7 @@ pub async fn enqueue_benchmark_request(
317319

318320
// Target x benchmark_set x backend x profile -> BenchmarkJob
319321
for target in Target::all() {
320-
for benchmark_set in 0..benchmark_set_count(target.into()) {
322+
for benchmark_set in 0..get_benchmark_sets_for_target(target.into()).len() {
321323
for &backend in backends.iter() {
322324
for &profile in profiles.iter() {
323325
enqueue_job(
@@ -367,7 +369,7 @@ pub async fn enqueue_benchmark_request(
367369
target,
368370
CodegenBackend::Llvm,
369371
Profile::Opt,
370-
0u32,
372+
BENCHMARK_SET_RUNTIME_BENCHMARKS,
371373
BenchmarkJobKind::Runtime,
372374
EnqueueMode::Commit,
373375
)
@@ -384,7 +386,7 @@ pub async fn enqueue_benchmark_request(
384386
Target::X86_64UnknownLinuxGnu,
385387
CodegenBackend::Llvm,
386388
Profile::Opt,
387-
0u32,
389+
BENCHMARK_SET_RUSTC,
388390
BenchmarkJobKind::Rustc,
389391
EnqueueMode::Commit,
390392
)

0 commit comments

Comments
 (0)