Skip to content

fix(diagnostics): handle WouldBlock in stdout writes to prevent panic#20295

Merged
graphite-app[bot] merged 1 commit intomainfrom
fix/handle-wouldblock-stdout-writes
Mar 12, 2026
Merged

fix(diagnostics): handle WouldBlock in stdout writes to prevent panic#20295
graphite-app[bot] merged 1 commit intomainfrom
fix/handle-wouldblock-stdout-writes

Conversation

@Boshen
Copy link
Member

@Boshen Boshen commented Mar 12, 2026

Summary

  • Add ErrorKind::WouldBlock to all three check_for_writer_error functions across oxc_diagnostics, oxlint, and oxfmt
  • Prevents panic when stdout is in non-blocking mode (e.g. set by Tokio's #[tokio::main]), which can cause WouldBlock (EAGAIN) errors on macOS under high diagnostic output volume

Closes #20239

🤖 Generated with Claude Code

@Boshen Boshen requested a review from camc314 as a code owner March 12, 2026 16:06
Copilot AI review requested due to automatic review settings March 12, 2026 16:06
@github-actions github-actions bot added A-linter Area - Linter A-cli Area - CLI A-formatter Area - Formatter C-bug Category - Bug labels Mar 12, 2026
Copy link

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

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: 1e881cf0ef

ℹ️ 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".

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the CLI/diagnostics output error handling to also treat std::io::ErrorKind::WouldBlock as a non-fatal writer error, similar to Interrupted and BrokenPipe.

Changes:

  • Extend writer error suppression to include ErrorKind::WouldBlock in diagnostics output (oxc_diagnostics).
  • Extend writer error suppression to include ErrorKind::WouldBlock in oxlint CLI output.
  • Extend writer error suppression to include ErrorKind::WouldBlock in oxfmt output utility.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
crates/oxc_diagnostics/src/service.rs Ignores WouldBlock in writer-error helper used by diagnostics rendering + flushing.
apps/oxlint/src/lint.rs Ignores WouldBlock in stdout writer-error helper used by print_and_flush_stdout.
apps/oxfmt/src/core/utils.rs Ignores WouldBlock in writer-error helper used by print_and_flush.

You can also share your feedback on Copilot code review. Take the survey.

@Boshen Boshen added the 0-merge Merge with Graphite Merge Queue label Mar 12, 2026
Copy link
Member Author

Boshen commented Mar 12, 2026

Merge activity

@codspeed-hq
Copy link

codspeed-hq bot commented Mar 12, 2026

Merging this PR will not alter performance

✅ 53 untouched benchmarks
⏩ 3 skipped benchmarks1


Comparing fix/handle-wouldblock-stdout-writes (36c7b08) with main (6a26b93)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

…ic (#20295)

## Summary

- Add `ErrorKind::WouldBlock` to all three `check_for_writer_error` functions across `oxc_diagnostics`, `oxlint`, and `oxfmt`
- Prevents panic when stdout is in non-blocking mode (e.g. set by Tokio's `#[tokio::main]`), which can cause `WouldBlock` (EAGAIN) errors on macOS under high diagnostic output volume

Closes #20239

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@graphite-app graphite-app bot force-pushed the fix/handle-wouldblock-stdout-writes branch from 36c7b08 to 1c07b3b Compare March 12, 2026 16:19
@graphite-app graphite-app bot merged commit 1c07b3b into main Mar 12, 2026
21 checks passed
@graphite-app graphite-app bot deleted the fix/handle-wouldblock-stdout-writes branch March 12, 2026 16:30
@graphite-app graphite-app bot removed the 0-merge Merge with Graphite Merge Queue label Mar 12, 2026
Boshen added a commit that referenced this pull request Mar 14, 2026
### 🚀 Features

- e7163b6 ecmascript: Add known-globals to side-effect-free property
reads (#20212) (Dunqing)
- 139ab68 ecmascript: Add `property_write_side_effects` to
`MayHaveSideEffectsContext` (#20217) (Dunqing)

### 🐛 Bug Fixes

- 78c264a parser: Fix conditional expressions with arrow-function
alternates in TS (#20356) (camc314)
- 5c97b14 minifier: Recognize object spread of object literals as
side-effect-free (#20299) (Boshen)
- 1ff5c1d transformer/typescript: Rewrite extensions in dynamic
`import()` expressions (#20121) (Sverre Johansen)
- 1c07b3b diagnostics: Handle `WouldBlock` in stdout writes to prevent
panic (#20295) (Boshen)
- ade14d4 ecmascript: Enhance side-effect detection for classes,
TypedArrays, computed members, and spread (#20213) (Dunqing)

### ⚡ Performance

- 5474d0a semantic: V8-style walk-up reference resolution (#20292)
(Boshen)

### 📚 Documentation

- e4aa5b5 parser/napi, linter/plugins: Add JSDoc comments to raw
transfer constants (#20286) (overlookmotel)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
camc314 pushed a commit that referenced this pull request Mar 16, 2026
# Oxlint
### 🚀 Features

- c95951f linter/plugins: Implement `sourceCode.markVariableAsUsed` (#20357) (overlookmotel)
- 7a2a7d0 linter: Implement `n/handle-callback-err` rule (#19616) (Mikhail Baev)

### 🐛 Bug Fixes

- f8fbd6e linter/plugins: Remove `hashbang` property from AST (#20365) (overlookmotel)
- 6eb5b01 linter/prefer-await-to-then: Ignore Promise static methods (#20347) (camc314)
- a4b61f7 linter: Remove `defineConfig` check (#20308) (camc314)
- 3ad7f53 linter/explicit-module-boundary-types: False positive with satisfies expr (#20309) (camc314)
- f547401 linter/no-unused-private-class-members: Treat switch discriminants as read (#20307) (camc314)
- 1c07b3b diagnostics: Handle `WouldBlock` in stdout writes to prevent panic (#20295) (Boshen)

### ⚡ Performance

- e4f7248 linter: Remove unnecessary clone of owned String in drain loop (#20388) (Boshen)
- 4a67f1d linter: Eliminate Vec allocation in disable directive matching (#20387) (Boshen)
- 618a598 linter/plugins: Add fast path for files with no comments (#20366) (overlookmotel)
- b0125c5 linter/plugins: Deserialize comments without AST (#20364) (overlookmotel)
- 9cd612f linter/plugins: Recycle comment objects (#20362) (overlookmotel)
- bf442f8 linter/plugins: Cheaper `Token` creation (#20360) (overlookmotel)
- 5474d0a semantic: V8-style walk-up reference resolution (#20292) (Boshen)
- 7946eba linter/plugins: Avoid arguments spread and temp array when merging (#20318) (overlookmotel)
- fc7cf8a linter/plugins: Pre-define less CFG merger functions (#20317) (overlookmotel)
- 3b9eb28 linter/plugins: Streamline getting/creating visit fn mergers (#20319) (overlookmotel)
- f04e850 linter/plugins: Inline binary search functions into call sites (#20312) (overlookmotel)
- fe24afe linter/plugins: Apply replace globals TSDown plugin to JS files (#20305) (overlookmotel)
- 77cdacc linter/plugins: Use array buffer views for tokens (#20301) (overlookmotel)
- 910c941 linter/plugins: Reorder branches in `getTokenByRangeStart` (#20296) (overlookmotel)
- af7674c linter/tokens: Avoid extra token value allocation (#20013) (camc314)

### 📚 Documentation

- 24490b5 linter: Improve formatting for 80ish rules' docs. (#20411) (connorshea)
- 3383523 linter: Improve `--tsconfig` flag docs (#20342) (camc314)
# Oxfmt
### 🚀 Features

- d22c443 oxfmt: Export `OxfmtConfig` type (#20275) (leaysgur)
- a11ecff oxfmt/lsp: Respect `angular` language id as `.component.html` file (#20242) (Sysix)

### 🐛 Bug Fixes

- ce65099 formatter: Preserve parentheses around as expression before private field access (#20419) (bab)
- f908742 oxfmt: Revert #20326 partially (#20413) (leaysgur)
- 4ef93ea formatter: Honor trailing ignore comments after list separators (#19925) (Andreas Lubbe)
- 68fb0d0 oxfmt: Skip vite.config.ts which fails to import (#20326) (leaysgur)
- 88ee826 oxfmt: Handle literalline for script-in-vue (#20130) (leaysgur)
- 1c07b3b diagnostics: Handle `WouldBlock` in stdout writes to prevent panic (#20295) (Boshen)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-cli Area - CLI A-formatter Area - Formatter A-linter Area - Linter C-bug Category - Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

linter: panic with WouldBlock in oxc_diagnostics::service on large projects

2 participants