fix: harden concurrent quota and status updates
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user