fix(auth): 修复生产登录卡死与有界超时 #11

Merged
chengcheng merged 2 commits from codex/fix-api-key-pool-deadlock into main 2026-07-21 12:09:40 +08:00
Owner

原因

API Key 校验在持有 PostgreSQL 查询连接时,通过同一连接池更新 last_used_at。当并发鉴权占满池后,每个请求都等待额外连接,形成应用层连接池死锁,并进一步阻塞依赖数据库的本地登录和 /readyz

变更

  • 先完整收集同前缀 API Key 候选并关闭 Rows,再进行 bcrypt 比对和使用时间更新
  • PostgreSQL 连接、就绪检查、本地登录、浏览器登录和 Nginx 登录上游分别设置 5s/2s/5s/10s/15s 有界超时
  • 数据库不可用时返回 POSTGRES_UNAVAILABLEAUTH_STORE_UNAVAILABLE,日志只记录连接池统计
  • 与最新计费请求的 AbortSignal 合并逻辑兼容,并补齐隔离测试 schema 的 0017/0069 依赖
  • 更新 OpenAPI

兼容性与风险

请求体、成功响应、数据库结构和流式接口超时不变;本次不新增数据库迁移。last_used_at 更新失败仍令 API Key 鉴权失败。回滚只需恢复上一组 API/Web 镜像 digest,无需恢复数据库。

验证

  • MaxConns=1 API Key 回归通过;4 连接下 8 并发全部成功且无遗留连接
  • 池耗尽时 /readyz 约 2.1s 返回 503,登录约 5.1s 返回 503
  • Headless Chrome 验证登录 10s 后取消、退出加载态并显示稳定提示
  • 最新 main 上迁移完整 PostgreSQL 测试库后,CI 同款串行全量 Go 测试通过
  • gofmtgo vet ./...go test ./...govulncheck ./...
  • pnpm install --frozen-lockfilepnpm openapipnpm lintpnpm testpnpm buildpnpm audit --audit-level high
  • Compose、Nginx 语法、镜像、迁移、流水线和 SemVer 门禁全部通过
## 原因 API Key 校验在持有 PostgreSQL 查询连接时,通过同一连接池更新 `last_used_at`。当并发鉴权占满池后,每个请求都等待额外连接,形成应用层连接池死锁,并进一步阻塞依赖数据库的本地登录和 `/readyz`。 ## 变更 - 先完整收集同前缀 API Key 候选并关闭 Rows,再进行 bcrypt 比对和使用时间更新 - PostgreSQL 连接、就绪检查、本地登录、浏览器登录和 Nginx 登录上游分别设置 5s/2s/5s/10s/15s 有界超时 - 数据库不可用时返回 `POSTGRES_UNAVAILABLE` 或 `AUTH_STORE_UNAVAILABLE`,日志只记录连接池统计 - 与最新计费请求的 `AbortSignal` 合并逻辑兼容,并补齐隔离测试 schema 的 0017/0069 依赖 - 更新 OpenAPI ## 兼容性与风险 请求体、成功响应、数据库结构和流式接口超时不变;本次不新增数据库迁移。`last_used_at` 更新失败仍令 API Key 鉴权失败。回滚只需恢复上一组 API/Web 镜像 digest,无需恢复数据库。 ## 验证 - `MaxConns=1` API Key 回归通过;4 连接下 8 并发全部成功且无遗留连接 - 池耗尽时 `/readyz` 约 2.1s 返回 503,登录约 5.1s 返回 503 - Headless Chrome 验证登录 10s 后取消、退出加载态并显示稳定提示 - 最新 `main` 上迁移完整 PostgreSQL 测试库后,CI 同款串行全量 Go 测试通过 - `gofmt`、`go vet ./...`、`go test ./...`、`govulncheck ./...` - `pnpm install --frozen-lockfile`、`pnpm openapi`、`pnpm lint`、`pnpm test`、`pnpm build`、`pnpm audit --audit-level high` - Compose、Nginx 语法、镜像、迁移、流水线和 SemVer 门禁全部通过
chengcheng added 2 commits 2026-07-21 10:59:02 +08:00
先完整收集同前缀候选项并关闭查询结果,再执行 bcrypt 比对和 last_used_at 更新,避免小连接池下查询与更新相互等待。

新增 Rows 关闭顺序、前缀碰撞、MaxConns=1 和 8 并发真实 PostgreSQL 回归测试。
fix(auth): 为登录链路增加有界超时
ci / verify (pull_request) Successful in 10m14s
bc1ff2b62f
为 PostgreSQL 连接、就绪检查和本地登录设置分层超时,数据库不可用时返回稳定 503 错误码并记录无凭据的连接池统计。

前端登录在 10 秒后取消请求,Nginx 登录精确路由限制上游为 15 秒,同时更新 OpenAPI 和回归测试。

补充开发工具链安全 override,使高危依赖审计保持为零。
chengcheng force-pushed codex/fix-api-key-pool-deadlock from bc1ff2b62f to e9f287971a 2026-07-21 11:14:54 +08:00 Compare
chengcheng force-pushed codex/fix-api-key-pool-deadlock from e9f287971a to 6a9fd5127a 2026-07-21 11:31:15 +08:00 Compare
chengcheng force-pushed codex/fix-api-key-pool-deadlock from 6a9fd5127a to bfa17a3aba 2026-07-21 11:48:47 +08:00 Compare
chengcheng merged commit e533ec2367 into main 2026-07-21 12:09:40 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: BCAI/easyai-ai-gateway#11