fix(review): TOCTOU лимита тенантов + персист NubesSub + пакетный http.Client

1. TenantStore.Create: повторная проверка глобального лимита тенантов под Lock
   (ранняя была под RLock — гонка могла превысить MaxTenantsGlobal).
2. CreateFromJWT: обновлённый NubesSub теперь персистится в Redis (раньше
   сохранялся только внутри ветки смены MaxQueues и терялся при рестарте);
   запись в Redis только при реальном изменении.
3. auth.PingNubesAPI: общий http.Client (keep-alive) вместо нового на каждый
   вызов.
This commit is contained in:
Repinoid
2026-10-08 15:19:15 +03:00
parent 33a0adc9be
commit 572c617f44
2 changed files with 21 additions and 6 deletions
+5 -2
View File
@@ -78,6 +78,10 @@ var nubesAPIEndpoints = []string{
"https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc",
}
// nubesHTTPClient — общий клиент для валидации токенов: переиспользует
// соединения (keep-alive) вместо создания нового клиента на каждый запрос.
var nubesHTTPClient = &http.Client{Timeout: 10 * time.Second}
// PingNubesAPI — проверяет валидность токена перебором стендов Nubes API.
// endpoint (если задан через NUBES_ENDPOINT) пробуется первым.
// Логика: токен принимается ТОЛЬКО при явном HTTP 2xx от стенда.
@@ -104,8 +108,7 @@ func PingNubesAPI(ctx context.Context, endpoint, token string) error {
req.Header.Set("Authorization", "Bearer "+token)
req.Header.Set("User-Agent", "Mozilla/5.0")
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Do(req)
resp, err := nubesHTTPClient.Do(req)
if err != nil {
lastErr = fmt.Errorf("nubes API unreachable at %s: %w", ep, err)
continue