Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

lsp.client: multi-mime LanguageServerProvider class registrations start one server process per MIME (reuse map is instance-keyed)

Aperta
#9,581 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
48/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
java

Direzione di ricerca

Inizia leggendo LSPBindings.buildBindings e le registrazioni di MimeLookup/layer coinvolte nella risoluzione delle istanze di LanguageServerProvider. Riproduci il problema con un provider registrato per text/javascript e text/typescript, quindi osserva i processi con pgrep. Il lavoro è completo quando lo stesso progetto usa un unico processo del server del linguaggio e un test di regressione copre la registrazione di più MIME e il riutilizzo.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

LSP
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-server processes for a single mixed JS/TS project,
  • two deno lsp processes for one deno workspace,
  • two ngserver processes 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
  1. Register one LanguageServerProvider class for two mimes (e.g. text/javascript and text/typescript) with a plain class-level registration.
  2. Open one file of each mime from the same project.
  3. 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).

Lingua principale
Java
Stelle
3.1k
Fork
939
Merge medio
4g 14h
PR unite (30g)
26

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/netbeans

Tutte le issue di apache/netbeans

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.