Skip to content

【架构优化】从 gitIndexLockHeldUnder 中拆出单进程 fd 目录扫描 fdDirHoldsFile #751

Open

Description

@fx-kurumi

现状问题

internal/runtime/git_isolation.go 的 gitIndexLockHeldUnder(约 57 行)在同一个函数里做了三件事:校验锁文件、遍历 /proc 下每个进程、再逐个读取该进程 fd 目录里的符号链接判断是否指向锁文件。最内层「扫描单个进程 fd 目录」嵌在两层循环里,和「读不到 fd 目录时是否记为不确定」的判定交织在一起,阅读和单测都不方便(现有测试只能借助真实 /proc 或伪造整棵进程树间接覆盖)。

重构方案

  • 新增 fdDirHoldsFile(dir, want string, lock os.FileInfo) (bool, error):读取一个进程的 fd 目录,按路径(target == want)或 inode(os.SameFile)判断是否有描述符指向锁文件;返回的 error 仅表示 fd 目录本身读取失败。
  • gitIndexLockHeldUnder 改为调用它:读取失败时沿用原有「外部属主 + 非 NotExist + 进程可能属于锁属主 → uncertain」判定,命中则 return true, true, nil。
  • 跳过 socket/pipe/匿名 inode(非 / 开头)的规则、注释和判定顺序逐字保持不变。

影响范围

仅 internal/runtime/git_isolation.go 内部私有函数,不改导出接口、不改行为;新增一个测试文件。

验证方式

  • 新增 TestFdDirHoldsFile:覆盖空目录、pipe/socket/anon_inode、指向其他文件、悬空链接、同路径命中、硬链接同 inode 命中、fd 目录不存在返回 NotExist。
  • 现有 TestGitIndexLock* / TestRestoreProjectAgentGitIndex* 继续通过。
  • go vet ./internal/runtime/、go test ./internal/runtime/。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions