ci: split the wire round trips out of the fuzz marker - #181
Merged
Conversation
chandrakananandi
self-requested a review
August 19, 2026 16:22
chandrakananandi
approved these changes
Aug 19, 2026
chandrakananandi
left a comment
Contributor
There was a problem hiding this comment.
Thanks for fixing this!
The nightly Integration Tests job failed in `run template fuzz tests` the
first night the wire round-trip suite existed. `-m 'fuzz' tests` selected
two unrelated suites: the 36 template tests the step is named for, and the
13 round trips in tests/test_wire_roundtrip.py, whose fixture builds
`wire-echo` with cargo at test time. The step runs `pytest -n 2` and that
fixture is session-scoped *per xdist worker*, so both workers asked rustup
to install the pinned 1.96 toolchain at the same moment. One rolled back
("detected conflict: 'bin/rust-gdb'") and the other found the wreckage:
"the 'cargo' binary ... is not applicable to the
'1.96-x86_64-unknown-linux-gnu' toolchain".
Installing the toolchain up front — pytest.yml already does, for exactly
this reason — would have fixed the crash but left this job paying an
uncached cargo build inside a 20-minute budget, for tests it gains nothing
by running: they pin their own max_examples, so this job's
HYPOTHESIS_PROFILE=extended never reaches them, and pytest.yml runs them at
the same depth on every push to master.
So split the marker instead. `wire` is not a statement about what those
tests do — they are fuzz tests — but about what selecting them commits a
job to: having the pinned Rust toolchain. A Rust-free job can now ask for
`fuzz` and stay Rust-free, which is what this one wants. pytest.yml selects
`-m 'not expensive'` and so keeps running all 35 tests in the file.
The `sync-deps` comment claimed the job "doesn't compile the Rust crates",
which stopped being true the moment those tests carried `fuzz`; it now says
that no toolchain gets installed and points at the step that depends on it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fuzz
fuzzfuzz marker
chandrakananandi
approved these changes
Aug 19, 2026
chandrakananandi
left a comment
Contributor
There was a problem hiding this comment.
Seems like a better fix. Thanks!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The nightly Integration Tests job died in
run template fuzz teststhe first night the wireround-trip suite existed — run 32218703320,
13 errors, one cause.
-m 'fuzz' testsselects two unrelated suites, and only one of them is Python. The 36 templatetests the step is named for, and the 13 round trips in
tests/test_wire_roundtrip.py, whosewire_echofixture buildswire-echowith cargo at test time. The step runspytest -n 2and thatfixture is session-scoped per xdist worker, so both workers asked rustup to install the pinned 1.96
toolchain at the same instant. rustup's install path is not safe against concurrent invocations: one
call rolled back (
failed to install component: 'rustc-x86_64-unknown-linux-gnu', detected conflict: 'bin/rust-gdb') and the other found what the rollback left behind (the 'cargo' binary ... is not applicable to the '1.96-x86_64-unknown-linux-gnu' toolchain). Not a flake that turned:rust-toolchain.tomland the suite both landed in #97 on 08-18, after that morning's scheduled run,so this was the first nightly to select them — 29 fuzz tests on 08-18, 49 on 08-19.
Installing the toolchain first would stop the crash and buy nothing. That is what
pytest.ymldoes, for exactly this hazard, and it is the wrong answer here: this job would pay an uncached cargo
build inside a 20-minute budget to re-run tests it cannot deepen and does not uniquely cover. They
pin
max_examples=200in their own@settings, so this job'sHYPOTHESIS_PROFILE: extendedneverreaches them — that profile is registered in
test_fuzzed_templates.pyalone. Andpytest.ymlselects
-m 'not expensive', which includes them, on every PR and every push to master, with thetoolchain installed and
rust/targetcached.So the marker splits by requirement rather than by kind.
wiresays nothing about what those testsdo — they are fuzz tests — only about what selecting them commits a job to: having the pinned Rust
toolchain. A job with no Rust can now ask for
fuzzand stay that way, which is what this one wants.The
sync-depscomment claiming the job "doesn't compile the Rust crates" stopped being true themoment those tests carried
fuzz; it now says that no toolchain gets installed, and points at thestep that depends on that.
Tests
The selector counts are the whole behavioural change:
pytest -m wire tests/test_wire_roundtrip.py: 13 passed.pytest -m "not expensive": 1036 passed,11 skipped.
pyright: 0 errors.Nothing in PR CI exercises the nightly's selector —
pytest.ymlnever runs-m fuzz— so the firstreal proof is the next scheduled run.
🤖 Generated with Claude Code