Skip to content

Commit 9f0c38c

Browse files
committed
only collect metrics on the first build attempt
1 parent 3f45731 commit 9f0c38c

File tree

3 files changed

+86
-38
lines changed

3 files changed

+86
-38
lines changed

src/bin/cratesfyi.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ impl BuildSubcommand {
469469
.as_ref()
470470
.map(|s| PackageKind::Registry(s.as_str()))
471471
.unwrap_or(PackageKind::CratesIo),
472+
true,
472473
)
473474
.context("Building documentation failed")?;
474475
}

src/build_queue.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub(crate) struct QueuedCrate {
2929
pub(crate) version: String,
3030
pub(crate) priority: i32,
3131
pub(crate) registry: Option<String>,
32+
pub(crate) attempt: i32,
3233
}
3334

3435
#[derive(Debug)]
@@ -165,7 +166,7 @@ impl AsyncBuildQueue {
165166

166167
Ok(sqlx::query_as!(
167168
QueuedCrate,
168-
"SELECT id, name, version, priority, registry
169+
"SELECT id, name, version, priority, registry, attempt
169170
FROM queue
170171
WHERE attempt < $1
171172
ORDER BY priority ASC, attempt ASC, id ASC",
@@ -495,7 +496,7 @@ impl BuildQueue {
495496
let to_process = match self.runtime.block_on(
496497
sqlx::query_as!(
497498
QueuedCrate,
498-
"SELECT id, name, version, priority, registry
499+
"SELECT id, name, version, priority, registry, attempt
499500
FROM queue
500501
WHERE
501502
attempt < $1 AND
@@ -646,7 +647,7 @@ impl BuildQueue {
646647
return Err(err);
647648
}
648649

649-
builder.build_package(&krate.name, &krate.version, kind)
650+
builder.build_package(&krate.name, &krate.version, kind, krate.attempt == 0)
650651
})?;
651652

652653
Ok(processed)

src/docbuilder/rustwide_builder.rs

Lines changed: 81 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,8 @@ impl RustwideBuilder {
303303
.run(|build| {
304304
let metadata = Metadata::from_crate_root(build.host_source_dir())?;
305305

306-
let res = self.execute_build(HOST_TARGET, true, build, &limits, &metadata, true)?;
306+
let res =
307+
self.execute_build(HOST_TARGET, true, build, &limits, &metadata, true, false)?;
307308
if !res.result.successful {
308309
bail!("failed to build dummy crate for {}", rustc_version);
309310
}
@@ -351,7 +352,12 @@ impl RustwideBuilder {
351352
err.context(format!("failed to load local package {}", path.display()))
352353
})?;
353354
let package = metadata.root();
354-
self.build_package(&package.name, &package.version, PackageKind::Local(path))
355+
self.build_package(
356+
&package.name,
357+
&package.version,
358+
PackageKind::Local(path),
359+
false,
360+
)
355361
}
356362

357363
#[instrument(name = "docbuilder.build_package", parent = None, skip(self, name), fields(krate=name))]
@@ -360,6 +366,7 @@ impl RustwideBuilder {
360366
name: &str,
361367
version: &str,
362368
kind: PackageKind<'_>,
369+
collect_metrics: bool,
363370
) -> Result<BuildPackageSummary> {
364371
let (crate_id, release_id, build_id) = self.runtime.block_on(async {
365372
let mut conn = self.db.get_async().await?;
@@ -369,7 +376,15 @@ impl RustwideBuilder {
369376
Ok::<_, Error>((crate_id, release_id, build_id))
370377
})?;
371378

372-
match self.build_package_inner(name, version, kind, crate_id, release_id, build_id) {
379+
match self.build_package_inner(
380+
name,
381+
version,
382+
kind,
383+
crate_id,
384+
release_id,
385+
build_id,
386+
collect_metrics,
387+
) {
373388
Ok(successful) => Ok(BuildPackageSummary {
374389
successful,
375390
should_reattempt: false,
@@ -391,6 +406,7 @@ impl RustwideBuilder {
391406
}
392407
}
393408

409+
#[allow(clippy::too_many_arguments)]
394410
fn build_package_inner(
395411
&mut self,
396412
name: &str,
@@ -399,6 +415,7 @@ impl RustwideBuilder {
399415
crate_id: CrateId,
400416
release_id: ReleaseId,
401417
build_id: BuildId,
418+
collect_metrics: bool,
402419
) -> Result<bool> {
403420
info!("building package {} {}", name, version);
404421

@@ -506,7 +523,7 @@ impl RustwideBuilder {
506523

507524
// Perform an initial build
508525
let mut res =
509-
self.execute_build(default_target, true, build, &limits, &metadata, false)?;
526+
self.execute_build(default_target, true, build, &limits, &metadata, false, collect_metrics)?;
510527

511528
// If the build fails with the lockfile given, try using only the dependencies listed in Cargo.toml.
512529
let cargo_lock = build.host_source_dir().join("Cargo.lock");
@@ -528,7 +545,7 @@ impl RustwideBuilder {
528545
.run_capture()?;
529546
}
530547
res =
531-
self.execute_build(default_target, true, build, &limits, &metadata, false)?;
548+
self.execute_build(default_target, true, build, &limits, &metadata, false, collect_metrics)?;
532549
}
533550

534551
if res.result.successful {
@@ -565,6 +582,7 @@ impl RustwideBuilder {
565582
local_storage.path(),
566583
&mut successful_targets,
567584
&metadata,
585+
collect_metrics,
568586
)?;
569587
target_build_logs.insert(target, target_res.build_log);
570588
}
@@ -730,6 +748,7 @@ impl RustwideBuilder {
730748
}
731749

732750
#[instrument(skip(self, build))]
751+
#[allow(clippy::too_many_arguments)]
733752
fn build_target(
734753
&self,
735754
target: &str,
@@ -738,8 +757,17 @@ impl RustwideBuilder {
738757
local_storage: &Path,
739758
successful_targets: &mut Vec<String>,
740759
metadata: &Metadata,
760+
collect_metrics: bool,
741761
) -> Result<FullBuildResult> {
742-
let target_res = self.execute_build(target, false, build, limits, metadata, false)?;
762+
let target_res = self.execute_build(
763+
target,
764+
false,
765+
build,
766+
limits,
767+
metadata,
768+
false,
769+
collect_metrics,
770+
)?;
743771
if target_res.result.successful {
744772
// Cargo is not giving any error and not generating documentation of some crates
745773
// when we use a target compile options. Check documentation exists before
@@ -782,7 +810,7 @@ impl RustwideBuilder {
782810
items_with_examples: 0,
783811
};
784812

785-
self.prepare_command(build, target, metadata, limits, rustdoc_flags)?
813+
self.prepare_command(build, target, metadata, limits, rustdoc_flags, false)?
786814
.process_lines(&mut |line, _| {
787815
if line.starts_with('{') && line.ends_with('}') {
788816
let parsed = match serde_json::from_str::<HashMap<String, FileCoverage>>(line) {
@@ -810,6 +838,7 @@ impl RustwideBuilder {
810838
}
811839

812840
#[instrument(skip(self, build))]
841+
#[allow(clippy::too_many_arguments)]
813842
fn execute_build(
814843
&self,
815844
target: &str,
@@ -818,6 +847,7 @@ impl RustwideBuilder {
818847
limits: &Limits,
819848
metadata: &Metadata,
820849
create_essential_files: bool,
850+
collect_metrics: bool,
821851
) -> Result<FullBuildResult> {
822852
let cargo_metadata = CargoMetadata::load_from_rustwide(
823853
&self.workspace,
@@ -856,22 +886,32 @@ impl RustwideBuilder {
856886
let successful = {
857887
let _span = info_span!("cargo_build", target = %target, is_default_target).entered();
858888
logging::capture(&storage, || {
859-
self.prepare_command(build, target, metadata, limits, rustdoc_flags)
860-
.and_then(|command| command.run().map_err(Error::from))
861-
.is_ok()
889+
self.prepare_command(
890+
build,
891+
target,
892+
metadata,
893+
limits,
894+
rustdoc_flags,
895+
collect_metrics,
896+
)
897+
.and_then(|command| command.run().map_err(Error::from))
898+
.is_ok()
862899
})
863900
};
864901

865-
if let Some(compiler_metric_target_dir) = &self.config.compiler_metrics_collection_path {
866-
let metric_output = build.host_target_dir().join("metrics/");
867-
info!(
868-
"found {} files in metric dir, copy over to {} (exists: {})",
869-
fs::read_dir(&metric_output)?.count(),
870-
&compiler_metric_target_dir.to_string_lossy(),
871-
&compiler_metric_target_dir.exists(),
872-
);
873-
copy_dir_all(&metric_output, compiler_metric_target_dir)?;
874-
fs::remove_dir_all(&metric_output)?;
902+
if collect_metrics {
903+
if let Some(compiler_metric_target_dir) = &self.config.compiler_metrics_collection_path
904+
{
905+
let metric_output = build.host_target_dir().join("metrics/");
906+
info!(
907+
"found {} files in metric dir, copy over to {} (exists: {})",
908+
fs::read_dir(&metric_output)?.count(),
909+
&compiler_metric_target_dir.to_string_lossy(),
910+
&compiler_metric_target_dir.exists(),
911+
);
912+
copy_dir_all(&metric_output, compiler_metric_target_dir)?;
913+
fs::remove_dir_all(&metric_output)?;
914+
}
875915
}
876916

877917
// For proc-macros, cargo will put the output in `target/doc`.
@@ -911,6 +951,7 @@ impl RustwideBuilder {
911951
metadata: &Metadata,
912952
limits: &Limits,
913953
mut rustdoc_flags_extras: Vec<String>,
954+
collect_metrics: bool,
914955
) -> Result<Command<'ws, 'pl>> {
915956
// Add docs.rs specific arguments
916957
let mut cargo_args = vec![
@@ -978,7 +1019,7 @@ impl RustwideBuilder {
9781019
command = command.env(key, val);
9791020
}
9801021

981-
if self.config.compiler_metrics_collection_path.is_some() {
1022+
if collect_metrics && self.config.compiler_metrics_collection_path.is_some() {
9821023
// set the `./target/metrics/` directory inside the build container
9831024
// as a target directory for the metric files.
9841025
let flag = "-Zmetrics-dir=/opt/rustwide/target/metrics";
@@ -1151,7 +1192,7 @@ mod tests {
11511192
builder.update_toolchain()?;
11521193
assert!(
11531194
builder
1154-
.build_package(crate_, version, PackageKind::CratesIo)?
1195+
.build_package(crate_, version, PackageKind::CratesIo, false)?
11551196
.successful
11561197
);
11571198

@@ -1309,7 +1350,7 @@ mod tests {
13091350
builder.update_toolchain()?;
13101351
assert!(
13111352
builder
1312-
.build_package(crate_, version, PackageKind::CratesIo)?
1353+
.build_package(crate_, version, PackageKind::CratesIo, true)?
13131354
.successful
13141355
);
13151356

@@ -1344,7 +1385,7 @@ mod tests {
13441385
builder.update_toolchain()?;
13451386
assert!(
13461387
!builder
1347-
.build_package(crate_, version, PackageKind::CratesIo)?
1388+
.build_package(crate_, version, PackageKind::CratesIo, false)?
13481389
.successful
13491390
);
13501391

@@ -1464,7 +1505,7 @@ mod tests {
14641505
assert!(
14651506
// not successful build
14661507
!builder
1467-
.build_package(crate_, version, PackageKind::CratesIo)?
1508+
.build_package(crate_, version, PackageKind::CratesIo, false)?
14681509
.successful
14691510
);
14701511

@@ -1483,7 +1524,7 @@ mod tests {
14831524
builder.update_toolchain()?;
14841525
assert!(
14851526
builder
1486-
.build_package(crate_, version, PackageKind::CratesIo)?
1527+
.build_package(crate_, version, PackageKind::CratesIo, false)?
14871528
.successful
14881529
);
14891530

@@ -1514,7 +1555,7 @@ mod tests {
15141555
}
15151556
assert!(
15161557
builder
1517-
.build_package(crate_, version, PackageKind::CratesIo)?
1558+
.build_package(crate_, version, PackageKind::CratesIo, false)?
15181559
.successful
15191560
);
15201561

@@ -1570,7 +1611,7 @@ mod tests {
15701611
builder.update_toolchain()?;
15711612
assert!(
15721613
builder
1573-
.build_package(crate_, version, PackageKind::CratesIo)?
1614+
.build_package(crate_, version, PackageKind::CratesIo, false)?
15741615
.successful
15751616
);
15761617

@@ -1597,7 +1638,7 @@ mod tests {
15971638
builder.update_toolchain()?;
15981639
assert!(
15991640
builder
1600-
.build_package(crate_, version, PackageKind::CratesIo)?
1641+
.build_package(crate_, version, PackageKind::CratesIo, false)?
16011642
.successful
16021643
);
16031644

@@ -1615,7 +1656,7 @@ mod tests {
16151656
builder.update_toolchain()?;
16161657
assert!(
16171658
builder
1618-
.build_package(crate_, version, PackageKind::CratesIo)?
1659+
.build_package(crate_, version, PackageKind::CratesIo, false)?
16191660
.successful
16201661
);
16211662
Ok(())
@@ -1638,7 +1679,7 @@ mod tests {
16381679
// `Result` is `Ok`, but the build-result is `false`
16391680
assert!(
16401681
!builder
1641-
.build_package(crate_, version, PackageKind::CratesIo)?
1682+
.build_package(crate_, version, PackageKind::CratesIo, false)?
16421683
.successful
16431684
);
16441685

@@ -1666,7 +1707,7 @@ mod tests {
16661707
builder.update_toolchain()?;
16671708

16681709
// `Result` is `Ok`, but the build-result is `false`
1669-
let summary = builder.build_package(crate_, version, PackageKind::CratesIo)?;
1710+
let summary = builder.build_package(crate_, version, PackageKind::CratesIo, false)?;
16701711

16711712
assert!(!summary.successful);
16721713
assert!(summary.should_reattempt);
@@ -1710,7 +1751,7 @@ mod tests {
17101751
builder.update_toolchain()?;
17111752
assert!(
17121753
builder
1713-
.build_package(crate_, version, PackageKind::CratesIo)?
1754+
.build_package(crate_, version, PackageKind::CratesIo, false)?
17141755
.successful
17151756
);
17161757

@@ -1735,7 +1776,7 @@ mod tests {
17351776
builder.update_toolchain()?;
17361777
assert!(
17371778
builder
1738-
.build_package(crate_, version, PackageKind::CratesIo)?
1779+
.build_package(crate_, version, PackageKind::CratesIo, false)?
17391780
.successful
17401781
);
17411782

@@ -1822,7 +1863,12 @@ mod tests {
18221863
let mut builder = RustwideBuilder::init(env)?;
18231864
assert!(
18241865
builder
1825-
.build_package(DUMMY_CRATE_NAME, DUMMY_CRATE_VERSION, PackageKind::CratesIo)?
1866+
.build_package(
1867+
DUMMY_CRATE_NAME,
1868+
DUMMY_CRATE_VERSION,
1869+
PackageKind::CratesIo,
1870+
false
1871+
)?
18261872
.successful
18271873
);
18281874
assert_eq!(old_version, builder.rustc_version()?);

0 commit comments

Comments
 (0)