Skip to content

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

Description

@YodonTan

现象

在 Windows 上开启工作区搜索(flashgrep)后,Agent 执行某些 shell 命令会随机报“另一个程序正在使用此文件 / 拒绝访问”(Windows 错误 32/5),例如:

  • git clean -fdxrm -rfcargo clean
  • git checkout / 分支切换
  • 安装器/更新器替换 flashgrep.exe

根因分析

flashgrep 以 flashgrep serve --stdio 单例常驻子进程运行,工作区一打开就被拉起,之后整个应用运行期间不退出。由此在 Windows 上产生持续的文件占用:

  1. 进程常驻:daemon 仅在应用退出(perform_process_exit_cleanupshutdown_blockingsrc/apps/desktop/src/lib.rs)或关闭“工作区搜索”功能时被停止;工作区打开即被 warmup 拉起(src/apps/desktop/src/api/workspace_activation.rs)。
  2. 索引放在工作区内default_storage_root 返回 {repo}/.bitfun/search/flashgrep-indexsrc/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/<workspace-slug>/ 目录(已有 sessions / snapshots / plans 等按工作区分片的持久化目录)。
  3. 反馈 / 升级上游 wgqqqqq/flashgrep(当前 v0.2.10),确认 Windows 下是否以 FILE_SHARE_DELETE 打开文件、CloseRepo 是否解除 mmap。

环境

  • 平台:Windows
  • flashgrep:v0.2.10(resources/flashgrep/VERSION.json

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions