8000 fix(collector): take the write lock at the start of every state transaction by InfinityPacer · Pull Request #71 · InfinityPacer/meterleaf · GitHub
[go: up one dir, main page]

Skip to content

fix(collector): take the write lock at the start of every state transaction - #71

Merged
InfinityPacer merged 3 commits into
mainfrom
fix/collector-immediate-transactions
Nov 8, 2026
Merged

InfinityPacer merged 3 commits into
mainfrom
fix/collector-immediate-transactions

Conversation

@InfinityPacer
Copy link
Copy Markdown
Owner

问题

本机采集器的状态库有两个写入进程,每分钟的同步和常驻的 OTEL 中继。同步的写事务用默认的延迟模式,先读后写。如果读取之后中继提交了新记录,同步升级写锁时 SQLite 立即返回 database is locked,不经过 busy_timeout 等待,整轮同步失败。多个 Claude Code subagent 同时运行、中继提交密集时更容易撞上。数据不会丢,下一轮会重读,但日志里会出现同步失败。

改动

  • CollectorState.write() 用 BEGIN IMMEDIATE 开启写事务,事务开始就拿写锁,冲突时按 busy_timeout 排队。采集器里所有写事务(Claude Code、Codex、omp、OpenCode、Antigravity 读取,出队、确认、重新归属、OTEL 入队)都改用它。
  • tests/collector-agy.test.ts 里 omp 额度的重置时间是 2026-11-06 的固定值,现在已经过期,额度被当作失效清空,测试在 main 上已经失败。把这些重置时间改到 2100 年。
  • 版本 0.16.3。

验证

  • 新增回归测试:同步的写事务读取之后,另一个连接的提交不能插进来,同步自己的写入成功。
  • 一次性复现脚本对比两种模式。延迟模式下另一个连接中途提交,同步写入 1 ms 内失败。立即模式下另一个连接排队等待,同步写入成功。
  • bun test tests 620 个通过,bun run typecheck、bun run build 通过。

@InfinityPacer
InfinityPacer merged commit 8318a94 into main Nov 8, 2026
2 checks passed
@InfinityPacer
InfinityPacer deleted the fix/collector-immediate-transactions branch November 8, 2026 05:29
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

0