Skip to content

lsp: Bound the incoming language server message queue - #58867

Merged
Anthony-Eid merged 1 commit into
mainfrom
fix-lsp-unbounded-notifications
Jun 8, 2026
Merged

lsp: Bound the incoming language server message queue#58867
Anthony-Eid merged 1 commit into
mainfrom
fix-lsp-unbounded-notifications

Conversation

@Anthony-Eid

Copy link
Copy Markdown
Contributor

The background task reading a language server's stdout pushed every parsed message into an unbounded channel consumed on the foreground thread. If the main thread stalled while a server kept emitting notifications, messages accumulated at wire speed with no limit — matching the report in #58190 of 391 GB of memory growth during a multi-hour hang with a chatty server.

This bounds the queue at 128 messages. When full, the reader stops reading the server's stdout, so the OS pipe applies back pressure to the server instead of Zed buffering its output in memory. No messages are dropped, and healthy operation is unaffected. In flight client requests behind a full queue fail via their existing background executor timeouts.

Adds a regression test that wedges the consumer, asserts the queue stays bounded, then drains it and asserts no messages were lost.

Helps with #58190 and may also help with #31461.

Self-Review Checklist:

  • I've reviewed my own diff for quality, security, and reliability
  • Unsafe blocks (if any) have justifying comments
  • The content adheres to Zed's UI standards (UX/UI and icon guidelines)
  • Tests cover the new/changed behavior
  • Performance impact has been considered and is acceptable

Release Notes:

  • lsp: Improve Zed's memory usage when LSP's emitted messages faster than the foreground thread can handle them

@cla-bot cla-bot Bot added the cla-signed The user has signed the Contributor License Agreement label Jun 8, 2026
@zed-community-bot zed-community-bot Bot added the staff Pull requests authored by a current member of Zed staff label Jun 8, 2026
@Anthony-Eid
Anthony-Eid added this pull request to the merge queue Jun 8, 2026
Merged via the queue into main with commit 7f6f93c Jun 8, 2026
43 checks passed
@Anthony-Eid
Anthony-Eid deleted the fix-lsp-unbounded-notifications branch June 8, 2026 21:27
This was referenced Jun 18, 2026
jonx pushed a commit to jonx/zed-aros that referenced this pull request Jul 17, 2026
…#58867)

The background task reading a language server's stdout pushed every
parsed message into an unbounded channel consumed on the foreground
thread. If the main thread stalled while a server kept emitting
notifications, messages accumulated at wire speed with no limit —
matching the report in zed-industries#58190 of 391 GB of memory growth during a
multi-hour hang with a chatty server.

This bounds the queue at 128 messages. When full, the reader stops
reading the server's stdout, so the OS pipe applies back pressure to the
server instead of Zed buffering its output in memory. No messages are
dropped, and healthy operation is unaffected. In flight client requests
behind a full queue fail via their existing background executor
timeouts.

Adds a regression test that wedges the consumer, asserts the queue stays
bounded, then drains it and asserts no messages were lost.

Helps with zed-industries#58190 and may also help with zed-industries#31461.

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content adheres to Zed's UI standards
([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
and
[icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md)
guidelines)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- lsp: Improve Zed's memory usage when LSP's emitted messages faster
than the foreground thread can handle them
jolutz pushed a commit to jolutz/zed that referenced this pull request Aug 8, 2026
…#58867)

The background task reading a language server's stdout pushed every
parsed message into an unbounded channel consumed on the foreground
thread. If the main thread stalled while a server kept emitting
notifications, messages accumulated at wire speed with no limit —
matching the report in zed-industries#58190 of 391 GB of memory growth during a
multi-hour hang with a chatty server.

This bounds the queue at 128 messages. When full, the reader stops
reading the server's stdout, so the OS pipe applies back pressure to the
server instead of Zed buffering its output in memory. No messages are
dropped, and healthy operation is unaffected. In flight client requests
behind a full queue fail via their existing background executor
timeouts.

Adds a regression test that wedges the consumer, asserts the queue stays
bounded, then drains it and asserts no messages were lost.

Helps with zed-industries#58190 and may also help with zed-industries#31461.

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content adheres to Zed's UI standards
([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
and
[icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md)
guidelines)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- lsp: Improve Zed's memory usage when LSP's emitted messages faster
than the foreground thread can handle them
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed The user has signed the Contributor License Agreement staff Pull requests authored by a current member of Zed staff

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants