[USG-001] 记录使用量失败: {e}:cc-switch
Quick fix
将完整的使用量计算和 SQLite 写入移到 spawn_blocking,并对失败写入使用有界重试队列。
Symptom
Section titled “Symptom”[USG-001] 记录使用量失败: {e}使用量记录路径在 Tokio 异步上下文中同步获取 Mutex<Connection> 并执行磁盘 I/O;锁竞争或慢磁盘会阻塞运行时工作线程,导致流式响应卡顿。原有调用方仅记录警告,写入失败后不会重试,因此使用量统计会出现缺口。
Issue 中存在两种实现方向:一方将价格查询、计算和写入整体放进 spawn_blocking,并补齐 log_forward_error 等调用路径;另一方还加入有界重试队列。后者在重试五次失败、队列达到 10,000 条或进程退出时仍可能丢失记录;是否需要持久化队列仍是待设计决定。
将价格来源读取、使用量计算和 SQLite 写入组成的完整数据库访问链移入 spawn_blocking,避免在 Tokio 工作线程上持有 Mutex<Connection>。
为失败的写入加入有界重试队列;Issue 中的实现为最多重试 5 次,线性退避 250ms 至 1s,并在最终丢弃或队列满时记录包含请求 ID 的 error 日志。
同时检查 log_forward_error 及其异步处理器调用链,确保同一数据库锁的热路径也不会内联阻塞运行时。
Affected Versions
Section titled “Affected Versions”Toolcc-switch
Version未知
Platforms未知
Source Issues
Section titled “Source Issues”- 使用量记录是否允许被丢弃?
- 现有讨论中的有界队列会在全部 5 次重试失败、队列达到 10,000 条或进程退出时丢弃记录;若要求永不丢失,需要额外的持久化落盘方案。
- 需要启用 WAL 吗?
- Issue 中的分析认为应用只有一个由 Mutex<Connection> 串行化的连接,WAL 不会带来多连接读写并发收益,且会增加 -wal 和 -shm 侧车文件及备份风险。
这是一个非官方社区 wiki,与 cc-switch 作者及项目本身无隶属关系。内容整理自项目公开的 GitHub issues。本站不分发任何软件。