Skip to content

v0.3.18 — 网关侧真修:reset 时刻加 45 天上限,哨兵日期不再钉死熔断器

Choose a tag to compare

@oliveagle oliveagle released this 12 Nov 07:33
· 34 commits to main since this release

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 reset
  • edc728c — chore(release): 0.3.17 -> 0.3.18

CI(check / fmt / clippy -D warnings / policy / scripts / test / build)
在 main 与 v0.3.18 两个 ref 上全绿。