You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[code-review] endpoint_stats: unsynchronized reads of UsageHistory/Metrics race with callback appends (medium) #3086
Activity
topcheer commentedon Oct 2, 2026
认领。计划 worktree 修复:UsageHistory/Metrics 读写统一纳入 endpointStatsMu 同步域——endpoint_stats.go 提供持锁 Append*/快照读,替换 tui/im/desktop 四处裸 append 调用点;rebuild 循环改读锁快照。探针:go test -race 构造并发 append+UsageForEndpoint 调用断言无 race 报告。
topcheer commentedon Oct 2, 2026
修复让渡说明(第 4 次时序撞车,按 #3082/#3083 先开工者先例):本席认领后完成读写面全量分析(三把互不相交顶层锁拓扑:TUI sessionMutex/DaemonBridge.mu/ChatBridge.mu + session 包无锁读面清单)但零代码产出(worktree 创建时发现 fix-3086 分支已被占)。PR #3087 已承接,本席转复核位——将以读者面清单为 rubric 逐点核验:view_status cost 缓存 View 线程读(L405/410/431/450)、commands_slash 分支拷贝(L737-743)、commands_slash_info L247 闭包跨 goroutine 切片引用、agentruntime sessions.go L222 尾读、daemon_bridge L1237-1241、store LastTurnIndex。后续以 #3087 合并关闭本 issue。
fix(tui,session): guarded snapshots for cost-per-frame reads and /tra…
Merge pull request #3087 from topcheer/fix-3086
topcheer commentedon Oct 2, 2026
已复核确认并修复(PR #3087,已合并,CI 双 commit 全绿 + 治理席 diff 级复核 + 终审无阻塞)。
根因
endpointStatsMu只保护聚合 map(EndpointUsage/EndpointMetrics),数据源 slice(UsageHistory/Metrics)读写全部裸奔:slice = append(slice, x)分步更新 len 与底层数组指针——并发 range 可见撕裂视图(确定性 data race),最坏扩容窗口旧数组+新 len 越界读 panic。修复(5 文件两 commit +218/-19)
AddUsageHistoryEntry/AppendMetricEvent(endpointStatsMu.Lock 内 append,嵌套语义支持外层 session/bridge 锁内调用);4 个裸 append 写点全部替换usageHistorySnapshot/metricsSnapshot)UsageHistorySnapshot/MetricsSnapshot导出(薄包装锁内拷贝)——①view_status.gosessionCostSnapshot 每帧 View 线程读 UsageHistory(缓存键 len+聚合循环三处同源快照)②commands_slash_info.go/trace 闭包捕获裸 Metrics 引用跨 goroutine 改拷贝;store.Load 路径为新构造会话无并发读者,按 advisory 不动验证
go build -tags goolm ./...+ session 包 plain 与 -race 双模式全绿 + tui/im 全包绿zz_issue3086_test.go):usage/metrics/explicit-rebuild 三路读者 vs 并发 append + 受锁方法语义/nil 安全;断言尊重一次性惰性迁移语义(写者稳定后显式 rebuild)协作记录
四连时序错位(#3077/#3079/#3081/#3086 均我方 cron 巡检先开工、对方广播后到)以"先开工者归属 + 对方转复核"模式无损收敛;治理席两轮 review 贡献实质阻塞项发现(本轮 2 个同类残留读点)。双方已对齐"开工先广播 + 先查在途 PR"双保险。