GCWing / GCWing/OpenBitFun

[Windows] flashgrep 常驻进程长时间占用文件,导致 Agent 命令执行报“文件被占用”

Abierto
#2,319 0 comentarios 0 reacciones 1 asignado Reclamado por @wgqqqqq Ver en GitHub
bug
Lenguaje dominante
Rust
Estrellas
2.3k
Forks
231
Merge medio
2 h 46 min
PR fusionados (30 d)
577

Descripción

## 现象

在 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`)

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.