JianFeeeee
477b74230f
fix(限流): 用 ORDER BY ts 取窗口内最早一条,不靠 MIN(ts) —— 429 的 retry_after 恒为 60
## 缺陷
`SELECT MIN(ts) FROM rate_limits ...` 的聚合结果被 SQLite 驱动按 **string**
返回,扫进 `*time.Time` 失败 ⇒ 落到兜底 `return false, 60`。
⇒ 所有 429 的 `retry_after` 恒为 60,与真实剩余窗口
(最长 `sessionRateWindow` = 1h)完全无关。调用方拿到的重试提示是错的:
限流窗口还有 55 分钟,它却说 60 秒后重试。
## 修法
`SELECT ts FROM rate_limits WHERE bucket = $1 AND ts >= $2 ORDER BY ts ASC LIMIT 1`
排序取值走**结果集本身**,驱动按列类型给 `time.Time`;语义等价。
★ 同一形状的坑今天已出现两次:上午 2h 冷静期因 UTC vs HKT 差 8 小时而形同虚设,
晚上权限记账因两处 `if` 守卫而静默失效。**根子都是「SQLite 侧的时间/类型处理
与直觉不符」,而症状在别处。**
## 判据
4 格(retry_after 反映真实窗口 / 绝不超过 window / 窗口滚动后放行 /
只数窗口内的记录),其中主判据显式对比「修复前 60,修复后 ≈window」。
本改动此前已随 2026-10-01 的两次部署进入线上二进制(vcs.modified=true),
本次补提交以让 provenance 对得上。
2026-10-02 10:02:35 +08:00
..
2026-09-08 19:16:35 +08:00
2026-09-15 12:20:28 +08:00
2026-09-08 19:16:35 +08:00
2026-09-26 07:44:33 +08:00
2026-09-12 11:19:52 +08:00
2026-10-01 19:41:06 +08:00
2026-10-01 19:41:06 +08:00
2026-09-30 17:08:49 +08:00
2026-09-30 17:08:49 +08:00
2026-09-19 16:27:09 +08:00
2026-09-19 16:27:09 +08:00
2026-09-08 19:16:35 +08:00
2026-09-14 08:32:22 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-21 05:06:53 +08:00
2026-09-12 08:01:59 +08:00
2026-09-19 16:27:09 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-26 07:44:33 +08:00
2026-09-14 17:17:37 +08:00
2026-09-21 04:25:17 +08:00
2026-10-02 00:15:02 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-11 23:22:53 +08:00
2026-09-26 07:44:33 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-26 07:44:33 +08:00
2026-09-08 19:16:35 +08:00
2026-09-26 14:20:23 +08:00
2026-09-28 11:01:38 +08:00
2026-09-15 11:21:00 +08:00
2026-09-15 11:21:00 +08:00
2026-09-14 17:17:37 +08:00
2026-09-14 17:17:37 +08:00
2026-09-25 16:29:19 +08:00
2026-10-02 10:02:35 +08:00
2026-10-02 10:02:35 +08:00
2026-09-26 07:44:33 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-10-02 01:09:19 +08:00
2026-09-15 12:54:25 +08:00
2026-09-26 07:44:33 +08:00
2026-09-28 11:12:59 +08:00
2026-10-02 00:34:13 +08:00
2026-10-02 00:34:13 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-11 23:22:53 +08:00
2026-09-08 19:16:35 +08:00
2026-09-08 19:16:35 +08:00
2026-09-26 07:44:33 +08:00