fix: harden concurrent quota and status updates

This commit is contained in:
CaIon
2026-08-11 22:03:47 +08:00
parent 50e5377ea5
commit ccd535ef8e
14 changed files with 702 additions and 203 deletions
+15 -4
View File
@@ -19,7 +19,7 @@ func TestTokenAutoGroupsRoundTripThroughRedisHashCache(t *testing.T) {
AutoGroups: `["vip","default"]`,
}
require.NoError(t, cacheSetToken(token))
require.NoError(t, cacheSetTokenForTest(token))
cached, err := cacheGetTokenByKey(token.Key)
require.NoError(t, err)
assert.Equal(t, token.AutoGroups, cached.AutoGroups)
@@ -43,7 +43,7 @@ func TestTokenUpdateSynchronouslyNarrowsPreheatedAutoGroupsCache(t *testing.T) {
AutoGroups: `["default","vip"]`,
}
require.NoError(t, token.Insert())
require.NoError(t, cacheSetToken(token))
require.NoError(t, cacheSetTokenForTest(token))
preheated, err := cacheGetTokenByKey(token.Key)
require.NoError(t, err)
@@ -51,7 +51,18 @@ func TestTokenUpdateSynchronouslyNarrowsPreheatedAutoGroupsCache(t *testing.T) {
require.NoError(t, token.SetAutoGroups([]string{"vip"}))
require.NoError(t, token.Update())
immediate, err := cacheGetTokenByKey(token.Key)
// Update 是限制性变更:写库前删除缓存并设置 fence。缓存不再提供旧的
// 宽分组值,下一次读取必须看到收紧后的分组。
_, cacheErr := cacheGetTokenByKey(token.Key)
require.Error(t, cacheErr, "the pre-update cache entry must be invalidated")
reloaded, err := GetTokenByKey(token.Key, false)
require.NoError(t, err)
assert.JSONEq(t, `["vip"]`, immediate.AutoGroups)
assert.JSONEq(t, `["vip"]`, reloaded.AutoGroups)
}
// cacheSetTokenForTest 以测试身份写入完整 token 缓存(含额度字段),
// 模拟“已水合”的缓存状态。
func cacheSetTokenForTest(token Token) error {
_, err := cacheInitToken(token)
return err
}