codex/fix-api-key-pool-deadlock
main
API Key 校验在持有 PostgreSQL 查询连接时,通过同一连接池更新 last_used_at。当并发鉴权占满池后,每个请求都等待额外连接,形成应用层连接池死锁,并进一步阻塞依赖数据库的本地登录和 /readyz。
last_used_at
/readyz
POSTGRES_UNAVAILABLE
AUTH_STORE_UNAVAILABLE
AbortSignal
请求体、成功响应、数据库结构和流式接口超时不变;本次不新增数据库迁移。last_used_at 更新失败仍令 API Key 鉴权失败。回滚只需恢复上一组 API/Web 镜像 digest,无需恢复数据库。
MaxConns=1
gofmt
go vet ./...
go test ./...
govulncheck ./...
pnpm install --frozen-lockfile
pnpm openapi
pnpm lint
pnpm test
pnpm build
pnpm audit --audit-level high
先完整收集同前缀候选项并关闭查询结果,再执行 bcrypt 比对和 last_used_at 更新,避免小连接池下查询与更新相互等待。 新增 Rows 关闭顺序、前缀碰撞、MaxConns=1 和 8 并发真实 PostgreSQL 回归测试。
为 PostgreSQL 连接、就绪检查和本地登录设置分层超时,数据库不可用时返回稳定 503 错误码并记录无凭据的连接池统计。 前端登录在 10 秒后取消请求,Nginx 登录精确路由限制上游为 15 秒,同时更新 OpenAPI 和回归测试。 补充开发工具链安全 override,使高危依赖审计保持为零。
bc1ff2b62f
e9f287971a
6a9fd5127a
bfa17a3aba
No dependencies set.
The note is not visible to the blocked user.
原因
API Key 校验在持有 PostgreSQL 查询连接时,通过同一连接池更新
last_used_at。当并发鉴权占满池后,每个请求都等待额外连接,形成应用层连接池死锁,并进一步阻塞依赖数据库的本地登录和/readyz。变更
POSTGRES_UNAVAILABLE或AUTH_STORE_UNAVAILABLE,日志只记录连接池统计AbortSignal合并逻辑兼容,并补齐隔离测试 schema 的 0017/0069 依赖兼容性与风险
请求体、成功响应、数据库结构和流式接口超时不变;本次不新增数据库迁移。
last_used_at更新失败仍令 API Key 鉴权失败。回滚只需恢复上一组 API/Web 镜像 digest,无需恢复数据库。验证
MaxConns=1API Key 回归通过;4 连接下 8 并发全部成功且无遗留连接/readyz约 2.1s 返回 503,登录约 5.1s 返回 503main上迁移完整 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 highbc1ff2b62ftoe9f287971ae9f287971ato6a9fd5127a6a9fd5127atobfa17a3aba