Skip to content

fix(checkpoint): 规范化共享锁的文件路径 - #677

Open
Qiyuanqiii wants to merge 1 commit into
TencentCloud:mainfrom
Qiyuanqiii:codex/fix-issue-157-checkpoint-lock-alias
Open

fix(checkpoint): 规范化共享锁的文件路径#677
Qiyuanqiii wants to merge 1 commit into
TencentCloud:mainfrom
Qiyuanqiii:codex/fix-issue-157-checkpoint-lock-alias

Conversation

@Qiyuanqiii

Copy link
Copy Markdown

关联 Issue

Related to #157

背景与定位

#177 是维护者确认的 checkpoint 计数重校准标准修复,#474 负责 Persona 生成期间的并发更新保留。

本 PR 不实现另一套 recalibrate(),而是修复现有 checkpoint 文件锁未覆盖路径别名的问题。

问题根因

CheckpointManager 使用全局 fileLocks Map,按 checkpoint 文件路径字符串共享进程内锁。

代码注释声明锁按 resolved file path 管理,但构造函数实际使用 path.join()。因此相对路径与绝对路径即使指向同一个 recall_checkpoint.json,仍会产生两个不同的锁键。

两个 mutation 可以同时读取相同旧快照。临时文件加原子 rename 只能防止文件撕裂,无法防止 last-write-wins:

  • 预期 total_processed = 2
  • 修复前实际为 1
  • 其中一个 session 的 runner_states 也会丢失

实现方案

  • CheckpointManager 构造阶段使用 path.resolve() 固定 checkpoint 的绝对路径。
  • 相对路径、包含 .. 的路径和绝对路径现在共享同一个锁身份。
  • 新增确定性并发测试,通过受控 barrier 验证第二次 mutation 无法绕过共享锁。
  • 同时验证两个 capture 的计数、全局时间水位和 session 状态均被保留。

兼容性与边界

本 PR 不包含:

  • 新的计数重校准实现
  • Persona 阈值或 cursor 调整
  • checkpoint JSON 格式变更
  • 新配置或公开 API
  • 跨进程文件锁

相对 dataDir 仍按当前工作目录解析,只是解析结果在构造时固定,避免后续锁身份分裂。

修复前证据

新增测试在当前 main 上稳定失败:

expected total_processed 2
received 1

验证

  • 定向测试:1/1 通过
  • 定向测试重复执行:10/10 通过
  • 完整测试:5 个文件、68 项测试通过
  • 插件及三个脚本构建:通过
  • git diff --check:通过
npm test -- src/utils/checkpoint-lock-alias.test.ts --reporter=verbose
npm test
npm run build
git diff --check origin/main...HEAD

验证截图

image

Signed-off-by: Qiyuanqiii <2297740147@qq.com>
@Qiyuanqiii

Copy link
Copy Markdown
Author

YOMXXX老师我还记得你一句一句把我拉出迷雾里

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant