Skip to content

fleet: --tsan preflight must not trigger on --tsan-* sub-options (unblocks --concurrency-stress fleets) - #229

Merged
devdanzin merged 1 commit into
mainfrom
fleet-tsan-preflight-glob
Jul 20, 2026
Merged

fleet: --tsan preflight must not trigger on --tsan-* sub-options (unblocks --concurrency-stress fleets)#229
devdanzin merged 1 commit into
mainfrom
fleet-tsan-preflight-glob

Conversation

@devdanzin

Copy link
Copy Markdown
Owner

Problem

Starting a --concurrency-stress fleet fails the preflight:

--tsan is set but TARGET_PYTHON is not free-threaded + --with-thread-sanitizer: '.../rustpython'
  -> use a builds/*-ft-*-tsan interpreter
fleet: preflight failed

even though --tsan is not set. The cmd_check case glob *--tsan* matches --tsan-threads / --tsan-iterations — the knobs --concurrency-stress legitimately reuses (from #226) to size its stress region. --concurrency-stress runs on an ordinary interpreter, so it must not require a ThreadSanitizer build.

Fix

Narrow the build-check glob to the bare --tsan mode flag: *--tsan|*--tsan[!-]* (matches --tsan with a trailing space, or --tsan ending the string; [!-] excludes the --tsan- sub-option forms). Verified:

FUSIL_FLAGS before after
--concurrency-stress --tsan-threads 4 --tsan-iterations 200 ❌ wrongly blocked ✅ starts
--tsan --tsan-threads 4 (real TSan) triggers check ✅ still triggers
--modules x --tsan (bare at end) triggers check ✅ still triggers
--concurrency-stress --tsan-dedup-catalog=… (no bare --tsan) ❌ wrongly blocked ✅ starts

bash -n fleet/fleet clean.

🤖 Generated with Claude Code

…options

The `cmd_check` glob `*--tsan*` matched `--tsan-threads` / `--tsan-iterations` (and
`--tsan-dedup-*`), so a `--concurrency-stress` fleet -- which reuses those knobs but runs
on an ORDINARY interpreter (no ThreadSanitizer build) -- wrongly tripped the
"TARGET_PYTHON is not free-threaded + --with-thread-sanitizer" preflight and refused to
start. Narrow the pattern to the bare `--tsan` mode flag (`*--tsan|*--tsan[!-]*`: `--tsan `
with a space, or ending the string; `[!-]` excludes the `--tsan-` sub-option forms), so
real `--tsan` still requires a TSan target while `--concurrency-stress --tsan-threads N
--tsan-iterations N` starts on any interpreter (e.g. RustPython).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@devdanzin
devdanzin merged commit 209ebff into main Jul 20, 2026
2 checks passed
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