Skip to content

test(snapshots): bound the PTY spawn with the per-step timeout#2102

Merged
fengmk2 merged 4 commits into
mainfrom
fix/pty-spawn-timeout
Jul 9, 2026
Merged

test(snapshots): bound the PTY spawn with the per-step timeout#2102
fengmk2 merged 4 commits into
mainfrom
fix/pty-spawn-timeout

Conversation

@fengmk2

@fengmk2 fengmk2 commented Jul 9, 2026

Copy link
Copy Markdown
Member

The per-step timeout only wrapped the interaction phase (rx.recv_timeout): TestTerminal::spawn (openpty + fork/exec the child into the PTY) ran synchronously before it. On runners where that spawn can block (the Linux analog of the ConPTY blocking that keeps the Windows snapshot job on a GitHub-hosted runner), a wedged spawn was unbounded, and because the parallel execution gate holds the case's lease, it stalled the whole suite (6h job default, no step log).

Run the spawn on a helper thread bounded by the same per-step timeout: a wedged spawn now fails that one case, like any other step timeout, and the suite proceeds. The success path is unchanged (verified against the interactive picker cases). The abandoned helper thread is fine for a dev-only test binary that exits when the run ends.

What a wedged spawn looks like now

Forcing the spawn to block (the failure this fixes), the case now fails at its per-step timeout instead of hanging the run:

---- app_root_listing::picker_select::global ----
step `vp build` timed out after 2s; partial output:
(PTY spawn did not complete)

failures:
    app_root_listing::picker_select::global

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 84 filtered out; finished in 2.02s

(2s is a shortened demo timeout; the real per-step default is 50s. The other cases keep running and the step log is preserved, versus the old behavior where this same block hung the whole step until the 6h job default with no log.)

@netlify

netlify Bot commented Jul 9, 2026

Copy link
Copy Markdown

Deploy Preview for viteplus-preview canceled.

Name Link
🔨 Latest commit 0789c79
🔍 Latest deploy log https://app.netlify.com/projects/viteplus-preview/deploys/6a4f0aaa0e81a00008416e89

fengmk2 commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

How to use the Graphite Merge Queue

Add the label auto-merge to this PR to add it to the merge queue.

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@fengmk2

fengmk2 commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e16a7cf38f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/vite_cli_snapshots/tests/cli_snapshots/main.rs Outdated
@fengmk2 fengmk2 changed the base branch from main to graphite-base/2102 July 9, 2026 01:31
@fengmk2 fengmk2 force-pushed the fix/pty-spawn-timeout branch from e16a7cf to a7957d7 Compare July 9, 2026 01:31
@fengmk2 fengmk2 changed the base branch from graphite-base/2102 to fix/redact-scaffold-pm-version July 9, 2026 01:31
@fengmk2

fengmk2 commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

@codex review

@graphite-app graphite-app Bot changed the base branch from fix/redact-scaffold-pm-version to graphite-base/2102 July 9, 2026 01:40
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

Reviewed commit: 512c75f29d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@graphite-app graphite-app Bot force-pushed the graphite-base/2102 branch from 0f0a211 to ab7f35b Compare July 9, 2026 01:48
@graphite-app graphite-app Bot force-pushed the fix/pty-spawn-timeout branch from 512c75f to 122bd41 Compare July 9, 2026 01:48
@graphite-app graphite-app Bot changed the base branch from graphite-base/2102 to main July 9, 2026 01:49
@graphite-app graphite-app Bot force-pushed the fix/pty-spawn-timeout branch from 122bd41 to f1f780b Compare July 9, 2026 01:49
fengmk2 added 2 commits July 9, 2026 09:59
The per-step timeout only wrapped the interaction phase (rx.recv_timeout):
TestTerminal::spawn (openpty + fork/exec the child into the PTY) ran
synchronously before it. On runners where that spawn can block (the Linux
analog of the ConPTY blocking that keeps the Windows snapshot job on a
GitHub-hosted runner), a wedged spawn was unbounded, and because the
parallel execution gate holds the case's lease, it stalled the whole suite
(6h job default, no step log).

Run the spawn on a helper thread bounded by the same per-step timeout: a
wedged spawn now fails that one case (like any other step timeout) and the
suite proceeds. Success path is unchanged (verified against the interactive
picker cases). The helper thread is abandoned on timeout, which is fine for
a dev-only test binary that exits when the run ends.
If the spawn wait times out and the helper thread's TestTerminal::spawn
still succeeds afterwards, the send fails and the terminal was dropped
without killing its child (TestTerminal has no Drop that kills). Handle the
SendError and kill the child so a slow-but-live command cannot keep running
after the case has already failed.
@fengmk2 fengmk2 force-pushed the fix/pty-spawn-timeout branch from f1f780b to 504379f Compare July 9, 2026 02:00
@fengmk2 fengmk2 marked this pull request as ready for review July 9, 2026 02:11
@fengmk2 fengmk2 self-assigned this Jul 9, 2026
@fengmk2 fengmk2 requested a review from wan9chi July 9, 2026 02:11
@fengmk2 fengmk2 requested a review from cpojer July 9, 2026 02:34
@wan9chi

wan9chi commented Jul 9, 2026

Copy link
Copy Markdown
Member

You can consider writing the timeout in the snapshot like: https://github.com/voidzero-dev/vite-task/blob/cda404d1f12cb9fa4a73f93bd863a636ebc4dcd9/crates/vite_task_bin/tests/e2e_snapshots/main.rs#L584

This way the previous outputs will be naturally written in the snapshot.

@fengmk2 fengmk2 merged commit fd4144b into main Jul 9, 2026
52 checks passed
@fengmk2 fengmk2 deleted the fix/pty-spawn-timeout branch July 9, 2026 02:50
fengmk2 added a commit that referenced this pull request Jul 9, 2026
The recurring Linux snapshot hang survives #2102's spawn bound (a run that
contained the bound still wedged for the full 10-min step timeout), so the
wedge is at a different, still-unbounded point (or cumulative create-test
timeouts around the ctrl-c case). Add snap_trace (gated on VP_SNAP_TRACE=1),
writing START/phase/END lines straight to fd 2 so they survive libtest
capture and reach the CI log even when the step is killed by its timeout. A
step that logs START without END is the wedged one, and the phase markers
(spawn dispatched / spawned / waiting for exit) localize within it. Enable
it on the Linux PTY CI step; off by default everywhere else.
fengmk2 added a commit that referenced this pull request Jul 9, 2026
The recurring Linux snapshot hang survives #2102's spawn bound (a run that
contained the bound still wedged for the full 10-min step timeout), so the
wedge is at a different, still-unbounded point (or cumulative create-test
timeouts around the ctrl-c case). Add snap_trace (gated on VP_SNAP_TRACE=1),
writing START/phase/END lines straight to fd 2 so they survive libtest
capture and reach the CI log even when the step is killed by its timeout. A
step that logs START without END is the wedged one, and the phase markers
(spawn dispatched / spawned / waiting for exit) localize within it. Enable
it on the Linux PTY CI step; off by default everywhere else.
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.

2 participants