Skip to content

Make parallel frontend CI job compile tests in parallel - #157705

Closed
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests
Closed

Make parallel frontend CI job compile tests in parallel#157705
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests

Conversation

@zetanumbers

@zetanumberszetanumbers commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

It is time to have a CI job to catch parallel frontend issues for tests. This PR sets RUST_TEST_THREADS to 1 to sequentially execute each test to achieve max thread utilization by a single rustc process. Then iteration-count option is set to 2 to repeat each test since parallel frontend issues usually don't reproduce reliably.

try-job: optional-x86_64-gnu-parallel-frontend

@rustbotrustbot added A-CI Area: Our Github Actions CI A-testsuite Area: The testsuite used to check the correctness of rustc S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-infra Relevant to the infrastructure team, which will review and decide on the PR/issue. labels Jun 10, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: infra-ci
  • infra-ci expanded to Kobzol, Mark-Simulacrum, jdno, jieyouxu, marcoieni
  • Random selection from Mark-Simulacrum, jdno, jieyouxu, marcoieni

@jieyouxu

Copy link
Copy Markdown
Member

@bors try jobs=optional-x86_64-gnu-parallel-frontend

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 10, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 10, 2026
@rust-bors

rust-borsBot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 93be885 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 526s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

This comment has been minimized.

@jieyouxujieyouxu added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 12, 2026
@jieyouxu

This comment was marked as off-topic.

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
@rust-bors

This comment was marked as off-topic.

@jieyouxu

Copy link
Copy Markdown
Member

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 12, 2026
@rust-bors

rust-borsBot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 1810706 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 502s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job optional-x86_64-gnu-parallel-frontend failed! Check out the build log: (web)(plain enhanced)(plain)

Click to see the possible cause of the failure (guessed by this bot)
# Compile each test sequentially to achieve max thread utilization by a single rustc process
ENV RUST_TEST_THREADS 1
# Build the toolchain with multiple parallel frontend threads and then run tests
ENV SCRIPT python3 ../x.py --stage 2 test --set rust.parallel-frontend-threads=4 "--" --parallel-frontend-threads=4 --iteration-count=2
#!/bin/sh
# ignore-tidy-linelength
set -ex
---
x.py completions check
x.py help check
[TIMING:end] test::Tidy { } -- 31.941
[TIMING:start] test::BootstrapPy { }
usage: python3 -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b]
[-k TESTNAMEPATTERNS]
[tests ...]
python3 -m unittest: error: unrecognized arguments: --parallel-frontend-threads=4 --iteration-count=2
Command `/usr/bin/python3 -m unittest bootstrap_test.py --parallel-frontend-threads=4 --iteration-count=2 [workdir=/checkout/src/bootstrap/]` failed with exit code 2
Created at: src/bootstrap/src/core/build_steps/test.rs:3715:35
Executed at: src/bootstrap/src/core/build_steps/test.rs:3727:41
--- BACKTRACE vvv
0: <bootstrap::utils::exec::DeferredCommand>::finish_process
at /checkout/src/bootstrap/src/utils/exec.rs:939:17
1: <bootstrap::utils::exec::DeferredCommand>::wait_for_output::<&bootstrap::utils::exec::ExecutionContext>
at /checkout/src/bootstrap/src/utils/exec.rs:831:21
2: <bootstrap::utils::exec::ExecutionContext>::run
at /checkout/src/bootstrap/src/utils/exec.rs:741:45
3: <bootstrap::utils::exec::BootstrapCommand>::run::<&bootstrap::core::builder::Builder>
at /checkout/src/bootstrap/src/utils/exec.rs:339:27
4: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3727:41
5: <bootstrap::core::builder::Builder>::ensure::<bootstrap::core::build_steps::test::BootstrapPy>
at /checkout/src/bootstrap/src/core/builder/mod.rs:1596:36
6: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::make_run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3711:21
7: <bootstrap::core::builder::StepDescription>::maybe_run
at /checkout/src/bootstrap/src/core/builder/mod.rs:476:13
8: bootstrap::core::builder::cli_paths::match_paths_to_steps_and_run
at /checkout/src/bootstrap/src/core/builder/cli_paths.rs:141:22
9: <bootstrap::core::builder::Builder>::run_step_descriptions
at /checkout/src/bootstrap/src/core/builder/mod.rs:1139:9
10: <bootstrap::core::builder::Builder>::execute_cli
at /checkout/src/bootstrap/src/core/builder/mod.rs:1118:14
11: <bootstrap::Build>::build
at /checkout/src/bootstrap/src/lib.rs:803:25
12: bootstrap::main
at /checkout/src/bootstrap/src/bin/main.rs:130:11
13: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:250:5
14: std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/sys/backtrace.rs:166:18
15: std::rt::lang_start::<()>::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:206:18
16: <&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:287:21
17: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
18: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:544:19
19: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panic.rs:359:14
20: std::rt::lang_start_internal::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:175:24
21: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
---
28: __libc_start_main
29: _start
Command has failed. Rerun with -v to see more details.
Bootstrap failed while executing `--stage 2 test --set rust.parallel-frontend-threads=4 -- --parallel-frontend-threads=4 --iteration-count=2`
Build completed unsuccessfully in 0:01:14
local time: Fri Jun 12 15:04:34 UTC 2026
network time: Fri, 12 Jun 2026 15:04:34 GMT
##[error]Process completed with exit code 1.
##[group]Run echo "disk usage:"

@petrochenkov

Copy link
Copy Markdown
Contributor

@zetanumbers is on vacation until July 15, but we want these changes sooner, so #158307 resubmits and tries to fix them.

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 24, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
rust-timer added a commit that referenced this pull request Jul 9, 2026
Rollup merge of #158307 - heinwol:parallel-frontend-CI, r=jieyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes #157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 10, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CIArea: Our Github Actions CIA-testsuiteArea: The testsuite used to check the correctness of rustcT-infraRelevant to the infrastructure team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@zetanumbers@rustbot@jieyouxu@rust-log-analyzer@petrochenkov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Make parallel frontend CI job compile tests in parallel by zetanumbers · Pull Request #157705 · rust-lang/rust · GitHub
Skip to content

Make parallel frontend CI job compile tests in parallel - #157705

Closed
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests
Closed

Make parallel frontend CI job compile tests in parallel#157705
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests

Conversation

@zetanumbers

@zetanumberszetanumbers commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

It is time to have a CI job to catch parallel frontend issues for tests. This PR sets RUST_TEST_THREADS to 1 to sequentially execute each test to achieve max thread utilization by a single rustc process. Then iteration-count option is set to 2 to repeat each test since parallel frontend issues usually don't reproduce reliably.

try-job: optional-x86_64-gnu-parallel-frontend

@rustbotrustbot added A-CI Area: Our Github Actions CI A-testsuite Area: The testsuite used to check the correctness of rustc S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-infra Relevant to the infrastructure team, which will review and decide on the PR/issue. labels Jun 10, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: infra-ci
  • infra-ci expanded to Kobzol, Mark-Simulacrum, jdno, jieyouxu, marcoieni
  • Random selection from Mark-Simulacrum, jdno, jieyouxu, marcoieni

@jieyouxu

Copy link
Copy Markdown
Member

@bors try jobs=optional-x86_64-gnu-parallel-frontend

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 10, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 10, 2026
@rust-bors

rust-borsBot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 93be885 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 526s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

This comment has been minimized.

@jieyouxujieyouxu added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 12, 2026
@jieyouxu

This comment was marked as off-topic.

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
@rust-bors

This comment was marked as off-topic.

@jieyouxu

Copy link
Copy Markdown
Member

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 12, 2026
@rust-bors

rust-borsBot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 1810706 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 502s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job optional-x86_64-gnu-parallel-frontend failed! Check out the build log: (web)(plain enhanced)(plain)

Click to see the possible cause of the failure (guessed by this bot)
# Compile each test sequentially to achieve max thread utilization by a single rustc process
ENV RUST_TEST_THREADS 1
# Build the toolchain with multiple parallel frontend threads and then run tests
ENV SCRIPT python3 ../x.py --stage 2 test --set rust.parallel-frontend-threads=4 "--" --parallel-frontend-threads=4 --iteration-count=2
#!/bin/sh
# ignore-tidy-linelength
set -ex
---
x.py completions check
x.py help check
[TIMING:end] test::Tidy { } -- 31.941
[TIMING:start] test::BootstrapPy { }
usage: python3 -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b]
[-k TESTNAMEPATTERNS]
[tests ...]
python3 -m unittest: error: unrecognized arguments: --parallel-frontend-threads=4 --iteration-count=2
Command `/usr/bin/python3 -m unittest bootstrap_test.py --parallel-frontend-threads=4 --iteration-count=2 [workdir=/checkout/src/bootstrap/]` failed with exit code 2
Created at: src/bootstrap/src/core/build_steps/test.rs:3715:35
Executed at: src/bootstrap/src/core/build_steps/test.rs:3727:41
--- BACKTRACE vvv
0: <bootstrap::utils::exec::DeferredCommand>::finish_process
at /checkout/src/bootstrap/src/utils/exec.rs:939:17
1: <bootstrap::utils::exec::DeferredCommand>::wait_for_output::<&bootstrap::utils::exec::ExecutionContext>
at /checkout/src/bootstrap/src/utils/exec.rs:831:21
2: <bootstrap::utils::exec::ExecutionContext>::run
at /checkout/src/bootstrap/src/utils/exec.rs:741:45
3: <bootstrap::utils::exec::BootstrapCommand>::run::<&bootstrap::core::builder::Builder>
at /checkout/src/bootstrap/src/utils/exec.rs:339:27
4: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3727:41
5: <bootstrap::core::builder::Builder>::ensure::<bootstrap::core::build_steps::test::BootstrapPy>
at /checkout/src/bootstrap/src/core/builder/mod.rs:1596:36
6: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::make_run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3711:21
7: <bootstrap::core::builder::StepDescription>::maybe_run
at /checkout/src/bootstrap/src/core/builder/mod.rs:476:13
8: bootstrap::core::builder::cli_paths::match_paths_to_steps_and_run
at /checkout/src/bootstrap/src/core/builder/cli_paths.rs:141:22
9: <bootstrap::core::builder::Builder>::run_step_descriptions
at /checkout/src/bootstrap/src/core/builder/mod.rs:1139:9
10: <bootstrap::core::builder::Builder>::execute_cli
at /checkout/src/bootstrap/src/core/builder/mod.rs:1118:14
11: <bootstrap::Build>::build
at /checkout/src/bootstrap/src/lib.rs:803:25
12: bootstrap::main
at /checkout/src/bootstrap/src/bin/main.rs:130:11
13: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:250:5
14: std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/sys/backtrace.rs:166:18
15: std::rt::lang_start::<()>::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:206:18
16: <&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:287:21
17: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
18: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:544:19
19: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panic.rs:359:14
20: std::rt::lang_start_internal::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:175:24
21: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
---
28: __libc_start_main
29: _start
Command has failed. Rerun with -v to see more details.
Bootstrap failed while executing `--stage 2 test --set rust.parallel-frontend-threads=4 -- --parallel-frontend-threads=4 --iteration-count=2`
Build completed unsuccessfully in 0:01:14
local time: Fri Jun 12 15:04:34 UTC 2026
network time: Fri, 12 Jun 2026 15:04:34 GMT
##[error]Process completed with exit code 1.
##[group]Run echo "disk usage:"

@petrochenkov

Copy link
Copy Markdown
Contributor

@zetanumbers is on vacation until July 15, but we want these changes sooner, so #158307 resubmits and tries to fix them.

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 24, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
rust-timer added a commit that referenced this pull request Jul 9, 2026
Rollup merge of #158307 - heinwol:parallel-frontend-CI, r=jieyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes #157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 10, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CIArea: Our Github Actions CIA-testsuiteArea: The testsuite used to check the correctness of rustcT-infraRelevant to the infrastructure team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@zetanumbers@rustbot@jieyouxu@rust-log-analyzer@petrochenkov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Make parallel frontend CI job compile tests in parallel by zetanumbers · Pull Request #157705 · rust-lang/rust · GitHub
Skip to content

Make parallel frontend CI job compile tests in parallel - #157705

Closed
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests
Closed

Make parallel frontend CI job compile tests in parallel#157705
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests

Conversation

@zetanumbers

@zetanumberszetanumbers commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

It is time to have a CI job to catch parallel frontend issues for tests. This PR sets RUST_TEST_THREADS to 1 to sequentially execute each test to achieve max thread utilization by a single rustc process. Then iteration-count option is set to 2 to repeat each test since parallel frontend issues usually don't reproduce reliably.

try-job: optional-x86_64-gnu-parallel-frontend

@rustbotrustbot added A-CI Area: Our Github Actions CI A-testsuite Area: The testsuite used to check the correctness of rustc S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-infra Relevant to the infrastructure team, which will review and decide on the PR/issue. labels Jun 10, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: infra-ci
  • infra-ci expanded to Kobzol, Mark-Simulacrum, jdno, jieyouxu, marcoieni
  • Random selection from Mark-Simulacrum, jdno, jieyouxu, marcoieni

@jieyouxu

Copy link
Copy Markdown
Member

@bors try jobs=optional-x86_64-gnu-parallel-frontend

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 10, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 10, 2026
@rust-bors

rust-borsBot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 93be885 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 526s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

This comment has been minimized.

@jieyouxujieyouxu added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 12, 2026
@jieyouxu

This comment was marked as off-topic.

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
@rust-bors

This comment was marked as off-topic.

@jieyouxu

Copy link
Copy Markdown
Member

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 12, 2026
@rust-bors

rust-borsBot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 1810706 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 502s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job optional-x86_64-gnu-parallel-frontend failed! Check out the build log: (web)(plain enhanced)(plain)

Click to see the possible cause of the failure (guessed by this bot)
# Compile each test sequentially to achieve max thread utilization by a single rustc process
ENV RUST_TEST_THREADS 1
# Build the toolchain with multiple parallel frontend threads and then run tests
ENV SCRIPT python3 ../x.py --stage 2 test --set rust.parallel-frontend-threads=4 "--" --parallel-frontend-threads=4 --iteration-count=2
#!/bin/sh
# ignore-tidy-linelength
set -ex
---
x.py completions check
x.py help check
[TIMING:end] test::Tidy { } -- 31.941
[TIMING:start] test::BootstrapPy { }
usage: python3 -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b]
[-k TESTNAMEPATTERNS]
[tests ...]
python3 -m unittest: error: unrecognized arguments: --parallel-frontend-threads=4 --iteration-count=2
Command `/usr/bin/python3 -m unittest bootstrap_test.py --parallel-frontend-threads=4 --iteration-count=2 [workdir=/checkout/src/bootstrap/]` failed with exit code 2
Created at: src/bootstrap/src/core/build_steps/test.rs:3715:35
Executed at: src/bootstrap/src/core/build_steps/test.rs:3727:41
--- BACKTRACE vvv
0: <bootstrap::utils::exec::DeferredCommand>::finish_process
at /checkout/src/bootstrap/src/utils/exec.rs:939:17
1: <bootstrap::utils::exec::DeferredCommand>::wait_for_output::<&bootstrap::utils::exec::ExecutionContext>
at /checkout/src/bootstrap/src/utils/exec.rs:831:21
2: <bootstrap::utils::exec::ExecutionContext>::run
at /checkout/src/bootstrap/src/utils/exec.rs:741:45
3: <bootstrap::utils::exec::BootstrapCommand>::run::<&bootstrap::core::builder::Builder>
at /checkout/src/bootstrap/src/utils/exec.rs:339:27
4: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3727:41
5: <bootstrap::core::builder::Builder>::ensure::<bootstrap::core::build_steps::test::BootstrapPy>
at /checkout/src/bootstrap/src/core/builder/mod.rs:1596:36
6: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::make_run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3711:21
7: <bootstrap::core::builder::StepDescription>::maybe_run
at /checkout/src/bootstrap/src/core/builder/mod.rs:476:13
8: bootstrap::core::builder::cli_paths::match_paths_to_steps_and_run
at /checkout/src/bootstrap/src/core/builder/cli_paths.rs:141:22
9: <bootstrap::core::builder::Builder>::run_step_descriptions
at /checkout/src/bootstrap/src/core/builder/mod.rs:1139:9
10: <bootstrap::core::builder::Builder>::execute_cli
at /checkout/src/bootstrap/src/core/builder/mod.rs:1118:14
11: <bootstrap::Build>::build
at /checkout/src/bootstrap/src/lib.rs:803:25
12: bootstrap::main
at /checkout/src/bootstrap/src/bin/main.rs:130:11
13: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:250:5
14: std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/sys/backtrace.rs:166:18
15: std::rt::lang_start::<()>::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:206:18
16: <&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:287:21
17: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
18: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:544:19
19: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panic.rs:359:14
20: std::rt::lang_start_internal::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:175:24
21: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
---
28: __libc_start_main
29: _start
Command has failed. Rerun with -v to see more details.
Bootstrap failed while executing `--stage 2 test --set rust.parallel-frontend-threads=4 -- --parallel-frontend-threads=4 --iteration-count=2`
Build completed unsuccessfully in 0:01:14
local time: Fri Jun 12 15:04:34 UTC 2026
network time: Fri, 12 Jun 2026 15:04:34 GMT
##[error]Process completed with exit code 1.
##[group]Run echo "disk usage:"

@petrochenkov

Copy link
Copy Markdown
Contributor

@zetanumbers is on vacation until July 15, but we want these changes sooner, so #158307 resubmits and tries to fix them.

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 24, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
rust-timer added a commit that referenced this pull request Jul 9, 2026
Rollup merge of #158307 - heinwol:parallel-frontend-CI, r=jieyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes #157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 10, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CIArea: Our Github Actions CIA-testsuiteArea: The testsuite used to check the correctness of rustcT-infraRelevant to the infrastructure team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@zetanumbers@rustbot@jieyouxu@rust-log-analyzer@petrochenkov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Make parallel frontend CI job compile tests in parallel by zetanumbers · Pull Request #157705 · rust-lang/rust · GitHub
Skip to content

Make parallel frontend CI job compile tests in parallel - #157705

Closed
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests
Closed

Make parallel frontend CI job compile tests in parallel#157705
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests

Conversation

@zetanumbers

@zetanumberszetanumbers commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

It is time to have a CI job to catch parallel frontend issues for tests. This PR sets RUST_TEST_THREADS to 1 to sequentially execute each test to achieve max thread utilization by a single rustc process. Then iteration-count option is set to 2 to repeat each test since parallel frontend issues usually don't reproduce reliably.

try-job: optional-x86_64-gnu-parallel-frontend

@rustbotrustbot added A-CI Area: Our Github Actions CI A-testsuite Area: The testsuite used to check the correctness of rustc S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-infra Relevant to the infrastructure team, which will review and decide on the PR/issue. labels Jun 10, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: infra-ci
  • infra-ci expanded to Kobzol, Mark-Simulacrum, jdno, jieyouxu, marcoieni
  • Random selection from Mark-Simulacrum, jdno, jieyouxu, marcoieni

@jieyouxu

Copy link
Copy Markdown
Member

@bors try jobs=optional-x86_64-gnu-parallel-frontend

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 10, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 10, 2026
@rust-bors

rust-borsBot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 93be885 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 526s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

This comment has been minimized.

@jieyouxujieyouxu added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 12, 2026
@jieyouxu

This comment was marked as off-topic.

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
@rust-bors

This comment was marked as off-topic.

@jieyouxu

Copy link
Copy Markdown
Member

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 12, 2026
@rust-bors

rust-borsBot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 1810706 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 502s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job optional-x86_64-gnu-parallel-frontend failed! Check out the build log: (web)(plain enhanced)(plain)

Click to see the possible cause of the failure (guessed by this bot)
# Compile each test sequentially to achieve max thread utilization by a single rustc process
ENV RUST_TEST_THREADS 1
# Build the toolchain with multiple parallel frontend threads and then run tests
ENV SCRIPT python3 ../x.py --stage 2 test --set rust.parallel-frontend-threads=4 "--" --parallel-frontend-threads=4 --iteration-count=2
#!/bin/sh
# ignore-tidy-linelength
set -ex
---
x.py completions check
x.py help check
[TIMING:end] test::Tidy { } -- 31.941
[TIMING:start] test::BootstrapPy { }
usage: python3 -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b]
[-k TESTNAMEPATTERNS]
[tests ...]
python3 -m unittest: error: unrecognized arguments: --parallel-frontend-threads=4 --iteration-count=2
Command `/usr/bin/python3 -m unittest bootstrap_test.py --parallel-frontend-threads=4 --iteration-count=2 [workdir=/checkout/src/bootstrap/]` failed with exit code 2
Created at: src/bootstrap/src/core/build_steps/test.rs:3715:35
Executed at: src/bootstrap/src/core/build_steps/test.rs:3727:41
--- BACKTRACE vvv
0: <bootstrap::utils::exec::DeferredCommand>::finish_process
at /checkout/src/bootstrap/src/utils/exec.rs:939:17
1: <bootstrap::utils::exec::DeferredCommand>::wait_for_output::<&bootstrap::utils::exec::ExecutionContext>
at /checkout/src/bootstrap/src/utils/exec.rs:831:21
2: <bootstrap::utils::exec::ExecutionContext>::run
at /checkout/src/bootstrap/src/utils/exec.rs:741:45
3: <bootstrap::utils::exec::BootstrapCommand>::run::<&bootstrap::core::builder::Builder>
at /checkout/src/bootstrap/src/utils/exec.rs:339:27
4: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3727:41
5: <bootstrap::core::builder::Builder>::ensure::<bootstrap::core::build_steps::test::BootstrapPy>
at /checkout/src/bootstrap/src/core/builder/mod.rs:1596:36
6: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::make_run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3711:21
7: <bootstrap::core::builder::StepDescription>::maybe_run
at /checkout/src/bootstrap/src/core/builder/mod.rs:476:13
8: bootstrap::core::builder::cli_paths::match_paths_to_steps_and_run
at /checkout/src/bootstrap/src/core/builder/cli_paths.rs:141:22
9: <bootstrap::core::builder::Builder>::run_step_descriptions
at /checkout/src/bootstrap/src/core/builder/mod.rs:1139:9
10: <bootstrap::core::builder::Builder>::execute_cli
at /checkout/src/bootstrap/src/core/builder/mod.rs:1118:14
11: <bootstrap::Build>::build
at /checkout/src/bootstrap/src/lib.rs:803:25
12: bootstrap::main
at /checkout/src/bootstrap/src/bin/main.rs:130:11
13: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:250:5
14: std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/sys/backtrace.rs:166:18
15: std::rt::lang_start::<()>::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:206:18
16: <&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:287:21
17: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
18: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:544:19
19: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panic.rs:359:14
20: std::rt::lang_start_internal::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:175:24
21: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
---
28: __libc_start_main
29: _start
Command has failed. Rerun with -v to see more details.
Bootstrap failed while executing `--stage 2 test --set rust.parallel-frontend-threads=4 -- --parallel-frontend-threads=4 --iteration-count=2`
Build completed unsuccessfully in 0:01:14
local time: Fri Jun 12 15:04:34 UTC 2026
network time: Fri, 12 Jun 2026 15:04:34 GMT
##[error]Process completed with exit code 1.
##[group]Run echo "disk usage:"

@petrochenkov

Copy link
Copy Markdown
Contributor

@zetanumbers is on vacation until July 15, but we want these changes sooner, so #158307 resubmits and tries to fix them.

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 24, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
rust-timer added a commit that referenced this pull request Jul 9, 2026
Rollup merge of #158307 - heinwol:parallel-frontend-CI, r=jieyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes #157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 10, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CIArea: Our Github Actions CIA-testsuiteArea: The testsuite used to check the correctness of rustcT-infraRelevant to the infrastructure team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@zetanumbers@rustbot@jieyouxu@rust-log-analyzer@petrochenkov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Make parallel frontend CI job compile tests in parallel by zetanumbers · Pull Request #157705 · rust-lang/rust · GitHub
Skip to content

Make parallel frontend CI job compile tests in parallel - #157705

Closed
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests
Closed

Make parallel frontend CI job compile tests in parallel#157705
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests

Conversation

@zetanumbers

@zetanumberszetanumbers commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

It is time to have a CI job to catch parallel frontend issues for tests. This PR sets RUST_TEST_THREADS to 1 to sequentially execute each test to achieve max thread utilization by a single rustc process. Then iteration-count option is set to 2 to repeat each test since parallel frontend issues usually don't reproduce reliably.

try-job: optional-x86_64-gnu-parallel-frontend

@rustbotrustbot added A-CI Area: Our Github Actions CI A-testsuite Area: The testsuite used to check the correctness of rustc S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-infra Relevant to the infrastructure team, which will review and decide on the PR/issue. labels Jun 10, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: infra-ci
  • infra-ci expanded to Kobzol, Mark-Simulacrum, jdno, jieyouxu, marcoieni
  • Random selection from Mark-Simulacrum, jdno, jieyouxu, marcoieni

@jieyouxu

Copy link
Copy Markdown
Member

@bors try jobs=optional-x86_64-gnu-parallel-frontend

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 10, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 10, 2026
@rust-bors

rust-borsBot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 93be885 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 526s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

This comment has been minimized.

@jieyouxujieyouxu added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 12, 2026
@jieyouxu

This comment was marked as off-topic.

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
@rust-bors

This comment was marked as off-topic.

@jieyouxu

Copy link
Copy Markdown
Member

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 12, 2026
@rust-bors

rust-borsBot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 1810706 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 502s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job optional-x86_64-gnu-parallel-frontend failed! Check out the build log: (web)(plain enhanced)(plain)

Click to see the possible cause of the failure (guessed by this bot)
# Compile each test sequentially to achieve max thread utilization by a single rustc process
ENV RUST_TEST_THREADS 1
# Build the toolchain with multiple parallel frontend threads and then run tests
ENV SCRIPT python3 ../x.py --stage 2 test --set rust.parallel-frontend-threads=4 "--" --parallel-frontend-threads=4 --iteration-count=2
#!/bin/sh
# ignore-tidy-linelength
set -ex
---
x.py completions check
x.py help check
[TIMING:end] test::Tidy { } -- 31.941
[TIMING:start] test::BootstrapPy { }
usage: python3 -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b]
[-k TESTNAMEPATTERNS]
[tests ...]
python3 -m unittest: error: unrecognized arguments: --parallel-frontend-threads=4 --iteration-count=2
Command `/usr/bin/python3 -m unittest bootstrap_test.py --parallel-frontend-threads=4 --iteration-count=2 [workdir=/checkout/src/bootstrap/]` failed with exit code 2
Created at: src/bootstrap/src/core/build_steps/test.rs:3715:35
Executed at: src/bootstrap/src/core/build_steps/test.rs:3727:41
--- BACKTRACE vvv
0: <bootstrap::utils::exec::DeferredCommand>::finish_process
at /checkout/src/bootstrap/src/utils/exec.rs:939:17
1: <bootstrap::utils::exec::DeferredCommand>::wait_for_output::<&bootstrap::utils::exec::ExecutionContext>
at /checkout/src/bootstrap/src/utils/exec.rs:831:21
2: <bootstrap::utils::exec::ExecutionContext>::run
at /checkout/src/bootstrap/src/utils/exec.rs:741:45
3: <bootstrap::utils::exec::BootstrapCommand>::run::<&bootstrap::core::builder::Builder>
at /checkout/src/bootstrap/src/utils/exec.rs:339:27
4: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3727:41
5: <bootstrap::core::builder::Builder>::ensure::<bootstrap::core::build_steps::test::BootstrapPy>
at /checkout/src/bootstrap/src/core/builder/mod.rs:1596:36
6: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::make_run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3711:21
7: <bootstrap::core::builder::StepDescription>::maybe_run
at /checkout/src/bootstrap/src/core/builder/mod.rs:476:13
8: bootstrap::core::builder::cli_paths::match_paths_to_steps_and_run
at /checkout/src/bootstrap/src/core/builder/cli_paths.rs:141:22
9: <bootstrap::core::builder::Builder>::run_step_descriptions
at /checkout/src/bootstrap/src/core/builder/mod.rs:1139:9
10: <bootstrap::core::builder::Builder>::execute_cli
at /checkout/src/bootstrap/src/core/builder/mod.rs:1118:14
11: <bootstrap::Build>::build
at /checkout/src/bootstrap/src/lib.rs:803:25
12: bootstrap::main
at /checkout/src/bootstrap/src/bin/main.rs:130:11
13: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:250:5
14: std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/sys/backtrace.rs:166:18
15: std::rt::lang_start::<()>::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:206:18
16: <&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:287:21
17: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
18: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:544:19
19: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panic.rs:359:14
20: std::rt::lang_start_internal::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:175:24
21: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
---
28: __libc_start_main
29: _start
Command has failed. Rerun with -v to see more details.
Bootstrap failed while executing `--stage 2 test --set rust.parallel-frontend-threads=4 -- --parallel-frontend-threads=4 --iteration-count=2`
Build completed unsuccessfully in 0:01:14
local time: Fri Jun 12 15:04:34 UTC 2026
network time: Fri, 12 Jun 2026 15:04:34 GMT
##[error]Process completed with exit code 1.
##[group]Run echo "disk usage:"

@petrochenkov

Copy link
Copy Markdown
Contributor

@zetanumbers is on vacation until July 15, but we want these changes sooner, so #158307 resubmits and tries to fix them.

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 24, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
rust-timer added a commit that referenced this pull request Jul 9, 2026
Rollup merge of #158307 - heinwol:parallel-frontend-CI, r=jieyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes #157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 10, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CIArea: Our Github Actions CIA-testsuiteArea: The testsuite used to check the correctness of rustcT-infraRelevant to the infrastructure team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@zetanumbers@rustbot@jieyouxu@rust-log-analyzer@petrochenkov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Make parallel frontend CI job compile tests in parallel by zetanumbers · Pull Request #157705 · rust-lang/rust · GitHub
Skip to content

Make parallel frontend CI job compile tests in parallel - #157705

Closed
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests
Closed

Make parallel frontend CI job compile tests in parallel#157705
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests

Conversation

@zetanumbers

@zetanumberszetanumbers commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

It is time to have a CI job to catch parallel frontend issues for tests. This PR sets RUST_TEST_THREADS to 1 to sequentially execute each test to achieve max thread utilization by a single rustc process. Then iteration-count option is set to 2 to repeat each test since parallel frontend issues usually don't reproduce reliably.

try-job: optional-x86_64-gnu-parallel-frontend

@rustbotrustbot added A-CI Area: Our Github Actions CI A-testsuite Area: The testsuite used to check the correctness of rustc S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-infra Relevant to the infrastructure team, which will review and decide on the PR/issue. labels Jun 10, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: infra-ci
  • infra-ci expanded to Kobzol, Mark-Simulacrum, jdno, jieyouxu, marcoieni
  • Random selection from Mark-Simulacrum, jdno, jieyouxu, marcoieni

@jieyouxu

Copy link
Copy Markdown
Member

@bors try jobs=optional-x86_64-gnu-parallel-frontend

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 10, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 10, 2026
@rust-bors

rust-borsBot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 93be885 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 526s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

This comment has been minimized.

@jieyouxujieyouxu added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 12, 2026
@jieyouxu

This comment was marked as off-topic.

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
@rust-bors

This comment was marked as off-topic.

@jieyouxu

Copy link
Copy Markdown
Member

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 12, 2026
@rust-bors

rust-borsBot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 1810706 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 502s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job optional-x86_64-gnu-parallel-frontend failed! Check out the build log: (web)(plain enhanced)(plain)

Click to see the possible cause of the failure (guessed by this bot)
# Compile each test sequentially to achieve max thread utilization by a single rustc process
ENV RUST_TEST_THREADS 1
# Build the toolchain with multiple parallel frontend threads and then run tests
ENV SCRIPT python3 ../x.py --stage 2 test --set rust.parallel-frontend-threads=4 "--" --parallel-frontend-threads=4 --iteration-count=2
#!/bin/sh
# ignore-tidy-linelength
set -ex
---
x.py completions check
x.py help check
[TIMING:end] test::Tidy { } -- 31.941
[TIMING:start] test::BootstrapPy { }
usage: python3 -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b]
[-k TESTNAMEPATTERNS]
[tests ...]
python3 -m unittest: error: unrecognized arguments: --parallel-frontend-threads=4 --iteration-count=2
Command `/usr/bin/python3 -m unittest bootstrap_test.py --parallel-frontend-threads=4 --iteration-count=2 [workdir=/checkout/src/bootstrap/]` failed with exit code 2
Created at: src/bootstrap/src/core/build_steps/test.rs:3715:35
Executed at: src/bootstrap/src/core/build_steps/test.rs:3727:41
--- BACKTRACE vvv
0: <bootstrap::utils::exec::DeferredCommand>::finish_process
at /checkout/src/bootstrap/src/utils/exec.rs:939:17
1: <bootstrap::utils::exec::DeferredCommand>::wait_for_output::<&bootstrap::utils::exec::ExecutionContext>
at /checkout/src/bootstrap/src/utils/exec.rs:831:21
2: <bootstrap::utils::exec::ExecutionContext>::run
at /checkout/src/bootstrap/src/utils/exec.rs:741:45
3: <bootstrap::utils::exec::BootstrapCommand>::run::<&bootstrap::core::builder::Builder>
at /checkout/src/bootstrap/src/utils/exec.rs:339:27
4: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3727:41
5: <bootstrap::core::builder::Builder>::ensure::<bootstrap::core::build_steps::test::BootstrapPy>
at /checkout/src/bootstrap/src/core/builder/mod.rs:1596:36
6: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::make_run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3711:21
7: <bootstrap::core::builder::StepDescription>::maybe_run
at /checkout/src/bootstrap/src/core/builder/mod.rs:476:13
8: bootstrap::core::builder::cli_paths::match_paths_to_steps_and_run
at /checkout/src/bootstrap/src/core/builder/cli_paths.rs:141:22
9: <bootstrap::core::builder::Builder>::run_step_descriptions
at /checkout/src/bootstrap/src/core/builder/mod.rs:1139:9
10: <bootstrap::core::builder::Builder>::execute_cli
at /checkout/src/bootstrap/src/core/builder/mod.rs:1118:14
11: <bootstrap::Build>::build
at /checkout/src/bootstrap/src/lib.rs:803:25
12: bootstrap::main
at /checkout/src/bootstrap/src/bin/main.rs:130:11
13: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:250:5
14: std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/sys/backtrace.rs:166:18
15: std::rt::lang_start::<()>::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:206:18
16: <&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:287:21
17: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
18: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:544:19
19: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panic.rs:359:14
20: std::rt::lang_start_internal::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:175:24
21: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
---
28: __libc_start_main
29: _start
Command has failed. Rerun with -v to see more details.
Bootstrap failed while executing `--stage 2 test --set rust.parallel-frontend-threads=4 -- --parallel-frontend-threads=4 --iteration-count=2`
Build completed unsuccessfully in 0:01:14
local time: Fri Jun 12 15:04:34 UTC 2026
network time: Fri, 12 Jun 2026 15:04:34 GMT
##[error]Process completed with exit code 1.
##[group]Run echo "disk usage:"

@petrochenkov

Copy link
Copy Markdown
Contributor

@zetanumbers is on vacation until July 15, but we want these changes sooner, so #158307 resubmits and tries to fix them.

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 24, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
rust-timer added a commit that referenced this pull request Jul 9, 2026
Rollup merge of #158307 - heinwol:parallel-frontend-CI, r=jieyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes #157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 10, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CIArea: Our Github Actions CIA-testsuiteArea: The testsuite used to check the correctness of rustcT-infraRelevant to the infrastructure team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@zetanumbers@rustbot@jieyouxu@rust-log-analyzer@petrochenkov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Make parallel frontend CI job compile tests in parallel by zetanumbers · Pull Request #157705 · rust-lang/rust · GitHub
Skip to content

Make parallel frontend CI job compile tests in parallel - #157705

Closed
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests
Closed

Make parallel frontend CI job compile tests in parallel#157705
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests

Conversation

@zetanumbers

@zetanumberszetanumbers commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

It is time to have a CI job to catch parallel frontend issues for tests. This PR sets RUST_TEST_THREADS to 1 to sequentially execute each test to achieve max thread utilization by a single rustc process. Then iteration-count option is set to 2 to repeat each test since parallel frontend issues usually don't reproduce reliably.

try-job: optional-x86_64-gnu-parallel-frontend

@rustbotrustbot added A-CI Area: Our Github Actions CI A-testsuite Area: The testsuite used to check the correctness of rustc S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-infra Relevant to the infrastructure team, which will review and decide on the PR/issue. labels Jun 10, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: infra-ci
  • infra-ci expanded to Kobzol, Mark-Simulacrum, jdno, jieyouxu, marcoieni
  • Random selection from Mark-Simulacrum, jdno, jieyouxu, marcoieni

@jieyouxu

Copy link
Copy Markdown
Member

@bors try jobs=optional-x86_64-gnu-parallel-frontend

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 10, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 10, 2026
@rust-bors

rust-borsBot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 93be885 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 526s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

This comment has been minimized.

@jieyouxujieyouxu added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 12, 2026
@jieyouxu

This comment was marked as off-topic.

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
@rust-bors

This comment was marked as off-topic.

@jieyouxu

Copy link
Copy Markdown
Member

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 12, 2026
@rust-bors

rust-borsBot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 1810706 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 502s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job optional-x86_64-gnu-parallel-frontend failed! Check out the build log: (web)(plain enhanced)(plain)

Click to see the possible cause of the failure (guessed by this bot)
# Compile each test sequentially to achieve max thread utilization by a single rustc process
ENV RUST_TEST_THREADS 1
# Build the toolchain with multiple parallel frontend threads and then run tests
ENV SCRIPT python3 ../x.py --stage 2 test --set rust.parallel-frontend-threads=4 "--" --parallel-frontend-threads=4 --iteration-count=2
#!/bin/sh
# ignore-tidy-linelength
set -ex
---
x.py completions check
x.py help check
[TIMING:end] test::Tidy { } -- 31.941
[TIMING:start] test::BootstrapPy { }
usage: python3 -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b]
[-k TESTNAMEPATTERNS]
[tests ...]
python3 -m unittest: error: unrecognized arguments: --parallel-frontend-threads=4 --iteration-count=2
Command `/usr/bin/python3 -m unittest bootstrap_test.py --parallel-frontend-threads=4 --iteration-count=2 [workdir=/checkout/src/bootstrap/]` failed with exit code 2
Created at: src/bootstrap/src/core/build_steps/test.rs:3715:35
Executed at: src/bootstrap/src/core/build_steps/test.rs:3727:41
--- BACKTRACE vvv
0: <bootstrap::utils::exec::DeferredCommand>::finish_process
at /checkout/src/bootstrap/src/utils/exec.rs:939:17
1: <bootstrap::utils::exec::DeferredCommand>::wait_for_output::<&bootstrap::utils::exec::ExecutionContext>
at /checkout/src/bootstrap/src/utils/exec.rs:831:21
2: <bootstrap::utils::exec::ExecutionContext>::run
at /checkout/src/bootstrap/src/utils/exec.rs:741:45
3: <bootstrap::utils::exec::BootstrapCommand>::run::<&bootstrap::core::builder::Builder>
at /checkout/src/bootstrap/src/utils/exec.rs:339:27
4: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3727:41
5: <bootstrap::core::builder::Builder>::ensure::<bootstrap::core::build_steps::test::BootstrapPy>
at /checkout/src/bootstrap/src/core/builder/mod.rs:1596:36
6: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::make_run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3711:21
7: <bootstrap::core::builder::StepDescription>::maybe_run
at /checkout/src/bootstrap/src/core/builder/mod.rs:476:13
8: bootstrap::core::builder::cli_paths::match_paths_to_steps_and_run
at /checkout/src/bootstrap/src/core/builder/cli_paths.rs:141:22
9: <bootstrap::core::builder::Builder>::run_step_descriptions
at /checkout/src/bootstrap/src/core/builder/mod.rs:1139:9
10: <bootstrap::core::builder::Builder>::execute_cli
at /checkout/src/bootstrap/src/core/builder/mod.rs:1118:14
11: <bootstrap::Build>::build
at /checkout/src/bootstrap/src/lib.rs:803:25
12: bootstrap::main
at /checkout/src/bootstrap/src/bin/main.rs:130:11
13: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:250:5
14: std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/sys/backtrace.rs:166:18
15: std::rt::lang_start::<()>::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:206:18
16: <&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:287:21
17: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
18: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:544:19
19: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panic.rs:359:14
20: std::rt::lang_start_internal::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:175:24
21: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
---
28: __libc_start_main
29: _start
Command has failed. Rerun with -v to see more details.
Bootstrap failed while executing `--stage 2 test --set rust.parallel-frontend-threads=4 -- --parallel-frontend-threads=4 --iteration-count=2`
Build completed unsuccessfully in 0:01:14
local time: Fri Jun 12 15:04:34 UTC 2026
network time: Fri, 12 Jun 2026 15:04:34 GMT
##[error]Process completed with exit code 1.
##[group]Run echo "disk usage:"

@petrochenkov

Copy link
Copy Markdown
Contributor

@zetanumbers is on vacation until July 15, but we want these changes sooner, so #158307 resubmits and tries to fix them.

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 24, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
rust-timer added a commit that referenced this pull request Jul 9, 2026
Rollup merge of #158307 - heinwol:parallel-frontend-CI, r=jieyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes #157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 10, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CIArea: Our Github Actions CIA-testsuiteArea: The testsuite used to check the correctness of rustcT-infraRelevant to the infrastructure team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@zetanumbers@rustbot@jieyouxu@rust-log-analyzer@petrochenkov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Make parallel frontend CI job compile tests in parallel by zetanumbers · Pull Request #157705 · rust-lang/rust · GitHub
Skip to content

Make parallel frontend CI job compile tests in parallel - #157705

Closed
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests
Closed

Make parallel frontend CI job compile tests in parallel#157705
zetanumbers wants to merge 2 commits into
rust-lang:mainfrom
zetanumbers:parallel-tests

Conversation

@zetanumbers

@zetanumberszetanumbers commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

It is time to have a CI job to catch parallel frontend issues for tests. This PR sets RUST_TEST_THREADS to 1 to sequentially execute each test to achieve max thread utilization by a single rustc process. Then iteration-count option is set to 2 to repeat each test since parallel frontend issues usually don't reproduce reliably.

try-job: optional-x86_64-gnu-parallel-frontend

@rustbotrustbot added A-CI Area: Our Github Actions CI A-testsuite Area: The testsuite used to check the correctness of rustc S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-infra Relevant to the infrastructure team, which will review and decide on the PR/issue. labels Jun 10, 2026
@rustbot

Copy link
Copy Markdown
Collaborator

r? @jieyouxu

rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: infra-ci
  • infra-ci expanded to Kobzol, Mark-Simulacrum, jdno, jieyouxu, marcoieni
  • Random selection from Mark-Simulacrum, jdno, jieyouxu, marcoieni

@jieyouxu

Copy link
Copy Markdown
Member

@bors try jobs=optional-x86_64-gnu-parallel-frontend

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 10, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 10, 2026
@rust-bors

rust-borsBot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 93be885 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 526s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

This comment has been minimized.

@jieyouxujieyouxu added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 12, 2026
@jieyouxu

This comment was marked as off-topic.

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
@rust-bors

This comment was marked as off-topic.

@jieyouxu

Copy link
Copy Markdown
Member

@bors try

@rust-bors

This comment has been minimized.

rust-borsBot pushed a commit that referenced this pull request Jun 12, 2026
Make parallel frontend CI job compile tests in parallel
try-job: optional-x86_64-gnu-parallel-frontend
@rust-borsrust-borsBot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 12, 2026
@rust-bors

rust-borsBot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 1810706 failed: CI. Failed job:

A workflow was considered to be a failure because it took only 502s. The minimum duration for CI workflows is configured to be 600s.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job optional-x86_64-gnu-parallel-frontend failed! Check out the build log: (web)(plain enhanced)(plain)

Click to see the possible cause of the failure (guessed by this bot)
# Compile each test sequentially to achieve max thread utilization by a single rustc process
ENV RUST_TEST_THREADS 1
# Build the toolchain with multiple parallel frontend threads and then run tests
ENV SCRIPT python3 ../x.py --stage 2 test --set rust.parallel-frontend-threads=4 "--" --parallel-frontend-threads=4 --iteration-count=2
#!/bin/sh
# ignore-tidy-linelength
set -ex
---
x.py completions check
x.py help check
[TIMING:end] test::Tidy { } -- 31.941
[TIMING:start] test::BootstrapPy { }
usage: python3 -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b]
[-k TESTNAMEPATTERNS]
[tests ...]
python3 -m unittest: error: unrecognized arguments: --parallel-frontend-threads=4 --iteration-count=2
Command `/usr/bin/python3 -m unittest bootstrap_test.py --parallel-frontend-threads=4 --iteration-count=2 [workdir=/checkout/src/bootstrap/]` failed with exit code 2
Created at: src/bootstrap/src/core/build_steps/test.rs:3715:35
Executed at: src/bootstrap/src/core/build_steps/test.rs:3727:41
--- BACKTRACE vvv
0: <bootstrap::utils::exec::DeferredCommand>::finish_process
at /checkout/src/bootstrap/src/utils/exec.rs:939:17
1: <bootstrap::utils::exec::DeferredCommand>::wait_for_output::<&bootstrap::utils::exec::ExecutionContext>
at /checkout/src/bootstrap/src/utils/exec.rs:831:21
2: <bootstrap::utils::exec::ExecutionContext>::run
at /checkout/src/bootstrap/src/utils/exec.rs:741:45
3: <bootstrap::utils::exec::BootstrapCommand>::run::<&bootstrap::core::builder::Builder>
at /checkout/src/bootstrap/src/utils/exec.rs:339:27
4: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3727:41
5: <bootstrap::core::builder::Builder>::ensure::<bootstrap::core::build_steps::test::BootstrapPy>
at /checkout/src/bootstrap/src/core/builder/mod.rs:1596:36
6: <bootstrap::core::build_steps::test::BootstrapPy as bootstrap::core::builder::Step>::make_run
at /checkout/src/bootstrap/src/core/build_steps/test.rs:3711:21
7: <bootstrap::core::builder::StepDescription>::maybe_run
at /checkout/src/bootstrap/src/core/builder/mod.rs:476:13
8: bootstrap::core::builder::cli_paths::match_paths_to_steps_and_run
at /checkout/src/bootstrap/src/core/builder/cli_paths.rs:141:22
9: <bootstrap::core::builder::Builder>::run_step_descriptions
at /checkout/src/bootstrap/src/core/builder/mod.rs:1139:9
10: <bootstrap::core::builder::Builder>::execute_cli
at /checkout/src/bootstrap/src/core/builder/mod.rs:1118:14
11: <bootstrap::Build>::build
at /checkout/src/bootstrap/src/lib.rs:803:25
12: bootstrap::main
at /checkout/src/bootstrap/src/bin/main.rs:130:11
13: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:250:5
14: std::sys::backtrace::__rust_begin_short_backtrace::<fn(), ()>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/sys/backtrace.rs:166:18
15: std::rt::lang_start::<()>::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:206:18
16: <&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe as core::ops::function::FnOnce<()>>::call_once
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/core/src/ops/function.rs:287:21
17: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
18: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:544:19
19: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe, i32>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panic.rs:359:14
20: std::rt::lang_start_internal::{closure#0}
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/rt.rs:175:24
21: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
at /rustc/0417c25868d6dfbd1c291dfeae950504faa6f790/library/std/src/panicking.rs:581:40
---
28: __libc_start_main
29: _start
Command has failed. Rerun with -v to see more details.
Bootstrap failed while executing `--stage 2 test --set rust.parallel-frontend-threads=4 -- --parallel-frontend-threads=4 --iteration-count=2`
Build completed unsuccessfully in 0:01:14
local time: Fri Jun 12 15:04:34 UTC 2026
network time: Fri, 12 Jun 2026 15:04:34 GMT
##[error]Process completed with exit code 1.
##[group]Run echo "disk usage:"

@petrochenkov

Copy link
Copy Markdown
Contributor

@zetanumbers is on vacation until July 15, but we want these changes sooner, so #158307 resubmits and tries to fix them.

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Jun 24, 2026
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 8, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
jhpratt added a commit to jhpratt/rust that referenced this pull request Jul 9, 2026
…eyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
rust-timer added a commit that referenced this pull request Jul 9, 2026
Rollup merge of #158307 - heinwol:parallel-frontend-CI, r=jieyouxu
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes #157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request Jul 10, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jul 16, 2026
CI job for parallel frontend ui tests
## Summary
Part of rust-lang/compiler-team#1005.
Supersedes rust-lang/rust#157705.
### Initial setup in this PR
For the initial setup in this PR, we'll go ahead with the following combination:
- `RUST_TEST_THREADS`: `max(1, $(nproc) // ${PARALLEL_FRONTEND_THREADS})`
- `--parallel-frontend-threads`: **4**
- `--iteration-count`: **2**
Against `./x test tests/ui --stage=2` only. We can tune these knobs in follow-ups. In try jobs we ran, this should not exceed the current longest auto job duration (at around 3h 15m).
## Additional context
### Issues with the previous attempt
The issue with the original change was arguments `--parallel-frontend-threads=4 --iteration-count=2` being compiletest-only. They were being passed to other parts of the test harness (e.g. libtest) as is. These parts, however, have no clue of the arguments, hence the errors.
I've spent a lot of time on this and haven't found any reasonable way to fix this behavior. We could make bootstrap aware of these specific two arguments and have an additional internal logic for handling this. It's big of a hack, i reckon. The best decision i arrived at is to split testing into two parts: one for compiletest only and another for everything else. The issue is (AFAIK) we can't tell bootstrap (or x.py, at least) to "test the default stuff, but only for compiletest". When used like `x test tests/` it runs _all_ the tests in this directory, including non-default ones, and crashes as it can't find nodejs for doctests. `--skip compiler/ --skip library/ --skip src/tools/ --skip tests/incremental ...` is still not exhaustive list of exclusions.
I went on with a whitelist instead of a blacklist. But we, again, can't tell what tests are "default". There's a mechanism in [bootstrap::core::builder::Builder](https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/struct.Builder.html#structfield.log_cli_step_for_tests) for showing "dry-run" test suites, but it's not available from the cli. For now, my whitelist is quite small and i have no idea what should it be like.
r? @petrochenkov
---
try-job: optional-x86_64-gnu-parallel-frontend
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CIArea: Our Github Actions CIA-testsuiteArea: The testsuite used to check the correctness of rustcT-infraRelevant to the infrastructure team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@zetanumbers@rustbot@jieyouxu@rust-log-analyzer@petrochenkov