lsp.client: multi-mime LanguageServerProvider class registrations start one server process per MIME (reuse map is instance-keyed)
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 48/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 活発
- 技術スタック
- java
調査の方向性
まず、LSPBindings.buildBindings と、LanguageServerProvider インスタンスの解決に関係する MimeLookup/layer 登録を読んでください。text/javascript と text/typescript に登録された 1 つの provider で問題を再現し、その後 pgrep でプロセスを確認してください。同じプロジェクトが 1 つの language-server プロセスを使用し、複数 MIME の登録と再利用を回帰テストでカバーできれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Apache NetBeans version
Apache NetBeans 25 (observed on RELEASE300, still present on RELEASE310)
Bug description
Summary: When one LanguageServerProvider is registered for multiple MIME types with a class-level @MimeLookup.Registration / layer class registration, LSPBindings starts one language-server process per MIME type instead of reusing the running server, because its server-reuse map is keyed by provider instance — and a class registration places a separate .instance in each mime folder, each instantiated independently.
Measured effect (in a NetBeans-Platform-based IDE using ide/lsp.client, with providers registered for both text/javascript and text/typescript):
- two
typescript-language-serverprocesses for a single mixed JS/TS project, - two
deno lspprocesses for one deno workspace, - two
ngserverprocesses in an Angular project with a component (.ts) and its template open.
Each extra process is a full tsserver-class JVM/node footprint per project, silently.
Mechanism (from reading the RELEASE300/310 LSPBindings source/bytecode): buildBindings files a started server under every declared mime only when the same provider instance is presented for each mime folder. With a class-level registration, the second mime folder resolves a different instance of the same provider class, misses the reuse map, and a second server process is spawned. Shutdown being GC-driven (LSPReference + keep-alive) means both processes then live for the session.
Workaround we ship: converting every multi-mime provider registration to a static singleton factory method (methodvalue registration), so every mime folder resolves the same object. That fixes it completely — A/B measured 2 processes → 1 — but the requirement is undocumented and very easy to violate (we re-introduced it once via a three-mime CSS provider before gating registrations structurally).
Steps to reproduce
- Register one
LanguageServerProviderclass for two mimes (e.g.text/javascriptandtext/typescript) with a plain class-level registration. - Open one file of each mime from the same project.
- Observe two identical language-server processes for the project (e.g.
pgrep -fl typescript-language-server).
Expected behavior
One server process per project for a provider declared on multiple mimes — or, failing that, a documented requirement that multi-mime providers must be registered as singletons.
Suggested fix directions: key the reuse map by provider class (or by the provider's declared mime set), or have MimeLookup resolution for LanguageServerProvider treated as singleton-per-class in LSPBindings. Happy to provide more detail or test against a patch — we carry a structural test (registrations == getMimeTypes(), no class-instance backdoor) that could inform one upstream.
Context
Found while building NMOX Studio (Apache-2.0, NetBeans-Platform based): https://github.com/NMOX/NMOX-Studio — details in our engineering ledger entry 83 (docs/engineering/tech-debt.md).
- 主要言語
- Java
- スター
- 3.1k
- フォーク
- 939
- 平均マージ
- 5日 3時間
- マージ済み PR(30日)
- 22
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/netbeans のほかの issue
-
Contribution welcome kind:feature Platform
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
apache/netbeans#9614 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
kind:bug LSP needs:triage
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
apache/netbeans#9548 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Editor Java kind:feature needs:triage
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
メンテナーはふだん 1 日以内に返信
-
The main Options dialog window has buttons with OK on the left instead of on the right on Linuxオープンkind:bug needs:triage os:linux os:macos Platform UI
難易度 1/5 1〜3時間 初心者へのやさしさ 68/100
メンテナーはふだん 1 日以内に返信
-
kind:bug needs:triage
難易度 1/5 1〜3時間 初心者へのやさしさ 68/100
メンテナーはふだん 1 日以内に返信
apache/netbeans の issue をすべて見る
似ている issue
-
backend
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
bcgov/nr-forest-client#2524 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 74/100
メンテナーはふだん 1 日以内に返信
-
team:Lumberjack
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
OpenLiberty/open-liberty#35998 ·
メンテナーはふだん 1 日以内に返信
-
[BUG] SQS SendMessageBatch accepts more than 10 entries instead of TooManyEntriesInBatchRequest対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
floci-io/floci#5319 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信