Copilot CLI never prunes ~/.copilot/session-state, causing EMFILE / file-descriptor exhaustion (crashes VS Code Copilot Chat)
- 主要言語
- Shell
- スター
- 11.2k
- フォーク
- 1.9k
- 平均マージ
- 14時間 16分
- マージ済み PR(30日)
- 6
説明
### Summary
The Copilot CLI creates a `~/.copilot/session-state//` folder for **every** session — including background automations, heartbeats, and memory-consolidation runs — and **never prunes them**. On a heavily-used machine these accumulate into the thousands. A Copilot component then bulk-opens `session-state/*/workspace.yaml`, exhausting the process's file-descriptor table (libuv's ~8189 limit on Windows) and throwing `EMFILE: too many open files`. In VS Code this makes Copilot Chat hang on "working" and crash after a few turns.
This is the root cause behind microsoft/vscode#313799 — that's where it *manifests*, but the fix belongs here.
### Evidence (Windows, measured with Sysinternals `handle.exe`)
- `~/.copilot/session-state` contained **10,313 `workspace.yaml` files**, accumulated since 2026-02-18, never pruned.
- The Copilot `node.mojom.NodeService` utility process peaked at **~8,788 open handles** — right at the libuv fd ceiling — then dropped back to ~580 after the burst (which is why point-in-time snapshots look normal).
- In a single mid-spike handle dump, **3,256 of 3,352 (97%) File-handle paths were `session-state\...\workspace.yaml`**.
- Reducing the folder count to ~67 **immediately** resolved the EMFILE crashes.
### Two underlying issues
1. **No retention/cleanup (primary):** session-state folders grow unbounded — no age or count cap, no garbage collection.
2. **Unbounded fan-out open:** the code that reads `workspace.yaml` across sessions opens them without bounding concurrent file descriptors or closing promptly, so a large directory exhausts the fd table instead of degrading gracefully.
### Suggested fixes
- Add automatic retention (e.g., prune session-state older than N days, or cap to the M most-recent) on CLI startup and/or via a background task.
- Bound concurrency and ensure prompt handle closure when enumerating session metadata.
- Optionally consolidate session metadata into a single index/DB rather than one folder + file per session.
### Workaround
Periodically prune `~/.copilot/session-state` (e.g., a scheduled task that deletes folders older than ~14 days).
### Environment
Windows; GitHub Copilot CLI + VS Code Copilot Chat (stable).
コントリビューションガイド
調査の方向性
Start by locating the CLI code that creates and reads ~/.copilot/session-state, then trace startup or background-task entry points and the workspace.yaml enumeration. Reproduce the large-session case on Windows and verify that retention removes old state, file reads close promptly, and the CLI no longer reaches EMFILE under the reported workload.
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- vscode
- 領域
- cli, operating-systems
- issue の種類
- バグ
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100