Repository navigation
v0.3.18 — 网关侧真修:reset 时刻加 45 天上限,哨兵日期不再钉死熔断器
v0.3.18
网关侧真修:reset 时刻加 45 天上限
2026-11-11 的那起「opencode_go_1 离池 73 年」事故,此前只有投影层拦截 + 看门狗兜底
(knowledge/docs/maxllm-ha.md §10),网关二进制本身仍会把上游胡写的重置时刻当真。
0.3.18 把真修落进网关。
事故机理:一条 streamed 200 的失败事件里同时带着配额措辞和哨兵日期
2099-01-01;find_absolute_times 把它读成绝对时刻
(reset_at_ms = 4070908800000),熔断器于是 force-open 到那一刻 ——
而厂商自己的用量接口报的是 rolling 0%,根本没有限额。于是该成员从
auto 池里静默消失,池子悄悄缩了一圈。
为什么 45 天是上限:网关路由的每一种配额窗口都是「小时到月」量级
(5 小时 / 周度 / 月度)。比 45 天还远的重置时刻不可能是重置时刻 ——
它要么是哨兵值,要么是坏头,要么是烂掉的旧期限(SQLite 里存的,或从
还没带上限的同伴那里传染来的)。
上限加在信任发生的地方:
| 层 | 0.3.17 及以前 | 0.3.18 |
|---|---|---|
| 头部解析 | x-ratelimit-reset: 2100 直接采信 |
超出上限 ⇒ 丢弃该头,回落去读 body |
| body 候选 | 全部原样交给路由 | 超限候选在变成期限前被丢掉(识别层仍照旧返回全部候选,时间戳形状的测试因此不必跟着日历腐烂) |
| laya 的判断 | 采信它选的时刻 | 同样受上限约束;远期选择降级成「有配额、重置时刻未知」 |
流内失败判定(200 里的配额墙) |
直接采信 | 同一上限 |
| 熔断器(最后一道防线) | record_quota_until 原样 park;extend_quota_until 照单全收同伴的期限;restore 把哨兵行原样恢复 |
park 改走冷却阶梯(分钟 → 小时);拒绝采纳同伴的越限期限;restore 丢弃越限的持久化行 ⇒ 一次重启不再把成员钉死 |
故意不设上限的地方:运维/配置级挂起([quota_parking] 与 admin 的
force-open)保持无界 —— 人手写 until = 2099-01-01 就是那个意思,
那是另一个信任域。
回归测试:事故样本(一条 200 流,其失败里写着 2099-01-01)现在是测试 ——
成员必须落在冷却阶梯上,且 /admin/breakers 里活着的期限不得是那个哨兵。
另加:头部 x-ratelimit-reset: 4102444800(2100)被拒、运行时算出来的
+3 天 body 时刻照常采信、breaker 的 record/extend/restore 三处守卫、
以及一条 wiremock 上游回 4070908800000 ⇒ QuotaUnknown。
部署状态(2026-11-12)
| 节点 | 版本 | sha256[:16] |
|---|---|---|
| oleNas01 | 0.3.18 | 425ff0759ef85c29 |
| oleFedora01 | 0.3.18 | 425ff0759ef85c29 |
| vm_tecent_cloud_01 | 0.3.17 | 3de86d58bbb7011a(未升级:SSH 凭据本会话不可用,见下) |
| oleMacBookAir | 0.3.17 | 37b6586fcbc87153(arm64 原生构建;未升级:Mac 不可达) |
腾讯云节点待 SSH 恢复后补一次(推的是同一份产物,sha 保持 425ff075…;
产物已经在 NAS 的 ~/opt/maxllm/bin/maxllm-server 上等着,deploy.sh 从 NAS 取):
# 两种写法等价:默认 REMOTE 就是 root@10.126.126.199(mesh IP);
# 用别名需要那台机器的 ~/.ssh/config 里有 vm_tecent_cloud_01 条目。
REMOTE=root@10.126.126.199 SOURCE=oliveagle@10.126.126.6 \
~/.agents/ops/machines/vm_tecent_cloud_01/maxllm/deploy.sh(已用 DRY_RUN=1 验证过这条命令:取二进制、取配置、路径改写、cmd_cli 守卫、
dotvault 渲染 env 全部通过,只差最后那一步 SSH。)
Mac 本机待可达后走 native release 构建 → install 覆盖 →
launchctl kickstart -k gui/$(id -u)/com.oliveagle.maxllm。
附:本仓源码与 CI
本版本源码在 ~/repos/github.com/oliveagle/maxllm-src(origin
git@github.com:oliveagle/maxllm.git),两个提交分开:
4b02bd4— fix(gateway): a reset instant no quota window can express is not a resetedc728c— chore(release): 0.3.17 -> 0.3.18
CI(check / fmt / clippy -D warnings / policy / scripts / test / build)
在 main 与 v0.3.18 两个 ref 上全绿。