fix: разовая проверка не затирает более свежий локальный отзыв

lct-42: стейл-ответ SELECT, пришедший после конкурентного invalidate_login
на том же узле, откатывал поколение назад и снова принимал отозванную
cookie. После ожидания перепроверяем кэш и не перезаписываем более свежее
значение. Детерминированный тест гонки; SCALE-OUT.md отделяет старые
замеры от непроверенного кластерным смоуком изменения.
This commit is contained in:
kaifarikman 2026-09-27 17:13:01 +03:00
commit 42f1da7f83
2 changed files with 45 additions and 0 deletions

View file

@ -166,6 +166,12 @@ async def _resolve_unknown_login(login: str) -> int | None:
except Exception as exc: # noqa: BLE001 — fail closed, not FORBIDDEN
log.error("разовая проверка полномочий не удалась (%s)", type(exc).__name__)
raise _AuthStateUnavailable from exc
# A concurrent local revoke or sync tick may have written a newer
# generation while the SELECT above was in flight; the stale read
# must never clobber it back to an older, already-revoked epoch.
cached = _generations.get(login)
if cached is not None:
return cached
if version is None:
return None
_generations[login] = version