Skip to content

make: re-run a fuzz target once when it hits the deadline with no crasher - #313

Merged
mgilbir merged 1 commit into
mainfrom
mgilbir/ci/fuzz-deadline-rerun
Aug 22, 2026
Merged

make: re-run a fuzz target once when it hits the deadline with no crasher#313
mgilbir merged 1 commit into
mainfrom
mgilbir/ci/fuzz-deadline-rerun

Conversation

@mgilbir

@mgilbir mgilbir commented Aug 22, 2026

Copy link
Copy Markdown
Owner

Fixes the nightly failure in run 32551816165 (common/vml FuzzShapeRoundTrip).

Not a defect

fuzz: elapsed: 2m0s, execs: 3117299 (37901/sec), new interesting: 247
--- FAIL: FuzzShapeRoundTrip (120.08s)
    context deadline exceeded

Full execution rate at 2m0s of a 120s budget; the failure lands 80ms later. Nothing stalled — the coordinator gave up waiting on a worker at shutdown. The sibling target in the same job ran 121.0s and passed, so the difference is sub-second timing.

Three further reasons it is not the code under test:

  • No crasher was written. The uploaded artifact contains only committed seeds.
  • That target already bounds its parse with a fuzzbound budget, so a genuinely slow input would fail deterministically and name itself.
  • It does not reproduce. Four runs at CI settings on go1.25.0 — the toolchain CI actually uses. My first three runs were on 1.26.5 and were not the same evidence; worth saying, because I nearly rested the diagnosis on them.

Second time this class has cost a nightly, after FuzzDocxMailMerge.

The change

The exact pair — deadline message and no new crasher — is re-run once. Both halves keep it narrow:

case behaviour
wrote a crasher (whatever the message) never re-run → FAILED
any other failure message never re-run → FAILED
deadline + no crasher, hits it twice re-run → still FAILED
deadline + no crasher, passes second time PASSED ON RE-RUN, named

All four checked with planted targets, including one that writes a crasher while saying the deadline words — it is not re-run.

A target that passes the second time is named, not silently passed. A sweep that hides its own flakiness is how a nightly stops being read, which is the failure this exists to prevent rather than cause.

Verification

build, vet, golangci-lint 0 issues. Makefile-only change.

…sher

The nightly failed on common/vml FuzzShapeRoundTrip with "context deadline
exceeded" and no crasher. It is the second time this has cost a nightly, after
FuzzDocxMailMerge, and neither reproduces: this one survived four runs at the CI
settings on go1.25.0, the toolchain CI actually uses, after three on the newer
one that turned out not to be the same evidence.

The log says what it is. The execution rate was 37901/sec at 2m0s of a 120s
budget and the failure landed 80ms later, while the sibling target in the same
job ran 121.0s and passed. Nothing stalled; the coordinator gave up waiting on a
worker at shutdown. The parse in that target is already bounded by a fuzzbound
budget, so a genuinely slow input would have failed deterministically and named
itself instead.

So that exact pair — the deadline message and no new crasher — is re-run once.
Both halves keep it narrow. A crasher means a reproducible defect, so a target
that wrote one is never re-run however it phrased its failure; any other message
is never re-run; and a target that hits the deadline twice still fails the
sweep. Each of those four paths was checked with a planted target, including the
one that writes a crasher while saying the deadline words.

A target that passes the second time is listed under PASSED ON RE-RUN rather
than passing quietly. A sweep that hides its own flakiness is how a nightly
stops being read, which is the failure this exists to prevent, not to cause.
@mgilbir
mgilbir marked this pull request as ready for review August 22, 2026 06:26
@mgilbir
mgilbir merged commit c9ac100 into main Aug 22, 2026
1 check passed
@mgilbir
mgilbir deleted the mgilbir/ci/fuzz-deadline-rerun branch August 22, 2026 06:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant