ai-image-quota-cas

20260916-201504 轮 · 看它的历史
[靶子] clone=h8 port=20098 container=wt_h8_tp8 base=http://localhost:20098

[A] 登录 + 快照额度
  ✓ 登录成功(loginpost 返 info=1)
  ✓ 解析出 e2e_bot 的 uid(实得 990863)
  ✓ 读到出图额度快照 remaining=0 used=0 left=503
  ✓ 日计数键形态正确(实得 ac1_usecnt_20260916_1_990863)

[B] 缓存分支(remaining=0 → cacheCorp 日计数)
  ✓ 已把 remaining 压到 0 —— 本段验的确实是 cacheCorp 那条分支
  ✓ 把 left 投毒成 1(只改 cache 日计数)
  ✓ 并发见证:4 发里有 2 发同时越过了锁外预检(≥2 即构成抢跑)
  ✓ 没有意外响应(无)
  ✓ 恰好 1 发拿到签名(实得 1)
  ✓ 其余 3 发拿到「已用完」文案(实得 3)
  ✓ 守恒:remaining 减少 0 + 日计数增加 1 = 1 == 成功放行 1 次
  ✓ aiuse 只多了 1 行(实得 1)= 被拒的那几发拒在 corpInsert 之前
  ✓ 扣完 left 归 0(实得 0)

[C] 守卫:不是一刀切拒死
  ✓ 把 left 投毒成 5
  ✓ 单发成功并拿到 64 位签名(实得 "de1d718f80564123250bdef33790299a4ea15a3b6fd7e82932970c258476bd5f")
  ✓ 日计数 +1、aiuse +1(实得 +1 / +1)

[D] DB 分支(remaining>0 → user_ac1_remaining)
  ✓ 已把 remaining 临时置 1(实得 1)
  ✓ 把 left 投毒成 1(此时 left 的唯一来源就是那 1 点 remaining)
  ✓ 并发见证:4 发里有 4 发同时越过了锁外预检(≥2 即构成抢跑)
  ✓ 没有意外响应(无)
  ✓ 恰好 1 发拿到签名(实得 1)
  ✓ 其余 3 发拿到「已用完」文案(实得 3)
  ✓ 守恒:remaining 减少 1 + 日计数增加 0 = 1 == 成功放行 1 次
  ✓ remaining 扣到 0(实得 0)
  ✓ aiuse 只多了 1 行

[F] 锁是真的(外部持锁 → 请求 fail-closed)
  ✓ 扣减锁名形态正确(实得 ai_img_quota_1_990863)
  ✓ 开跑前这把锁没人持着
  ✓ 把 left 投毒成 5(额度充足 —— 被拒只可能是因为锁)
  ✓ 外部会话已按住这把锁(IS_USED_LOCK = 29472)
  ✓ 拿不到锁时 fail-closed 拒绝(实得 "系统繁忙,请稍后重试")
  ✓ 确实等满了 corpGetLock 的 2 秒(实测 2044ms)
  ✓ 被拒时一分额度都没扣、也没写 aiuse(used 498→498,aiuse 393)
  ✓ 外部持锁会话已结束、锁已释放

[E] 守卫:两轮抢锁之后仍拿得到锁
  ✓ 把 left 投毒成 3
  ✓ 单发仍然成功(实得 "89f7951cdec74b21f6e8af7387d032dc67df8af22f1ea3e74749becadac)
  ✓ 没有撞到 2 秒取锁超时(实测 30ms)
  ✓ 日计数 +1
  ✓ 已还原 user_ac1_remaining=0(实得 0)
  ✓ 已冲掉投毒的日计数(实得 0)
  ✓ 已清空突刺计数器

(本次 jnc_aiuse 新增的计量行按 e2e-integrity § 7.1 的 ○ 档保留,不清)

===== PASS=40 FAIL=0 =====