[Windows] flashgrep 常驻进程长时间占用文件,导致 Agent 命令执行报“文件被占用”
- Vorherrschende Sprache
- Rust
- Sterne
- 2.2k
- Forks
- 229
- Ø Merge
- 2 Std. 46 Min.
- Gemergte PRs (30 T.)
- 577
Beschreibung
## 现象
在 Windows 上开启工作区搜索(flashgrep)后,Agent 执行某些 shell 命令会随机报“另一个程序正在使用此文件 / 拒绝访问”(Windows 错误 32/5),例如:
- `git clean -fdx`、`rm -rf`、`cargo clean`
- `git checkout` / 分支切换
- 安装器/更新器替换 `flashgrep.exe`
## 根因分析
flashgrep 以 `flashgrep serve --stdio` 单例常驻子进程运行,工作区一打开就被拉起,之后整个应用运行期间不退出。由此在 Windows 上产生持续的文件占用:
1. **进程常驻**:daemon 仅在应用退出(`perform_process_exit_cleanup` → `shutdown_blocking`,`src/apps/desktop/src/lib.rs`)或关闭“工作区搜索”功能时被停止;工作区打开即被 warmup 拉起(`src/apps/desktop/src/api/workspace_activation.rs`)。
2. **索引放在工作区内**:`default_storage_root` 返回 `{repo}/.bitfun/search/flashgrep-index`(`src/crates/services/services-integrations/src/workspace_search/service.rs`)。daemon 以 mmap / WAL / segment 方式持有这些索引文件(协议字段 `active_segments` / `active_delete_segments` / `pending_docs` 佐证)。
3. **空闲释放形同虚设**:`schedule_repo_release` 只在“warmup 后工作区已切走”的竞态分支被调用一次,正常 `search/glob/status` 流程从不触发;且 `release_repo_if_idle` 只发送 `CloseRepo`,不停止 daemon 进程。
在 Windows 上,进程句柄 / 内存映射 / 目录监听句柄会阻止文件被删除、重命名或覆盖,因此 daemon 存活期间索引文件(以及 flashgrep.exe 映像)一直处于被占用状态。
## 影响
- Agent 的破坏性 / 切换类 shell 命令在 Windows 上随机失败,打断工作流。
- daemon 存活期间无法替换 `flashgrep.exe`。
## 可能的优化方向(调研结论,方案待定)
1. 空闲时真正释放 repo 会话,并在会话清空后停止 daemon 进程(复用已有的透明重启能力)。
2. 把索引移出工作区,放入全局 `~/.bitfun/projects//` 目录(已有 `sessions` / `snapshots` / `plans` 等按工作区分片的持久化目录)。
3. 反馈 / 升级上游 `wgqqqqq/flashgrep`(当前 v0.2.10),确认 Windows 下是否以 `FILE_SHARE_DELETE` 打开文件、`CloseRepo` 是否解除 mmap。
## 环境
- 平台:Windows
- flashgrep:v0.2.10(`resources/flashgrep/VERSION.json`)
Beitragsleitfaden
Bewertung
Dieses Issue wurde noch nicht bewertet.