-
Andrey Azeev authored
Запрос падал в 500, когда enforce_entry брал из пула протухшее Redis-соединение (закрытый uvloop TCPTransport). evalsha бил по мёртвому сокету сырым RuntimeError: ... the handler is closed; redis-py и tenacity такой тип не ретраят и не заворачивают в RedisError, поэтому он пробивал единственный except _REDIS_ERRORS и уходил в ASGI-границу необработанным. Нарушался инвариант модуля fail-open (ошибка Redis не роняет прокси). - lifecycle.py: health_check_interval=30.0 в RedisConfig — пул пингует idle-соединения и выбраковывает протухшие ДО записи (лечит корень). - enforce.py: fail-open в enforce_entry и record_status расширен на транспортные сбои (OSError, RuntimeError) через _FAIL_OPEN_ERRORS — страховка на окно между PING и реальной записью. - CHANGELOG.md: добавлен, записана эта правка.
bfb2fe57Andrey Azeev authoredЗапрос падал в 500, когда enforce_entry брал из пула протухшее Redis-соединение (закрытый uvloop TCPTransport). evalsha бил по мёртвому сокету сырым RuntimeError: ... the handler is closed; redis-py и tenacity такой тип не ретраят и не заворачивают в RedisError, поэтому он пробивал единственный except _REDIS_ERRORS и уходил в ASGI-границу необработанным. Нарушался инвариант модуля fail-open (ошибка Redis не роняет прокси). - lifecycle.py: health_check_interval=30.0 в RedisConfig — пул пингует idle-соединения и выбраковывает протухшие ДО записи (лечит корень). - enforce.py: fail-open в enforce_entry и record_status расширен на транспортные сбои (OSError, RuntimeError) через _FAIL_OPEN_ERRORS — страховка на окно между PING и реальной записью. - CHANGELOG.md: добавлен, записана эта правка.
Loading