gendesign/tradein-mvp/backend/app/core
bot-backend ae6d28d5e2
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m4s
fix(mera): pool_timeout 30→5 с — отдельным коммитом, с триггером отката
Единственная правка ветки, которая меняет РЕЖИМ ОТКАЗА при исчерпании пула:
было «медленно» (ждём коннект до 30 с), стало «быстро с ошибкой» (5 с и
`sqlalchemy.exc.TimeoutError` → 500, глобального обработчика в app/main.py нет).
И едет она во все сервисы образа — backend, scraper, tgbot
(tradein-mvp/docker-compose.prod.yml), для скраппера и бота обоснования в коде
нет: за 29 ч логов исчерпания пула не было ни разу, проверить новое значение на
проде пока не на чем.

Поэтому коммит последний в ветке: ветку можно мержить без него, а на проде —
откатить одной командой (`git revert`).

Обоснование самого значения: чекаут коннекта нельзя прервать `asyncio.wait_for`,
он занимает поток `asyncio.to_thread` целиком, а пул потоков конечен
(min(32, cpu+4)) — исчерпанный пул коннектов превращается в исчерпанный пул
потоков. 5 с короче самого короткого бюджета источника (8 с Yandex/Cian/
house_meta; geocode 12 с, IMV 20 с — длиннее): занятый пул деградирует ОДИН
источник, а не весь запрос.

ТРИГГЕР ОТКАТА (вернуть 30 с) записан в комментарии рядом со значением: любое
`QueuePool limit ... timed out` в логах бэкенда ЛИБО рост failed+zombie в
`scrape_runs` после деплоя.

Правка комментария по ревью (L2): «вчетверо больше любого бюджета внешнего
источника (8 с)» было неточно — бюджеты 8 / 12 / 20 с, перечислены явно.
Гейт `test_pool_checkout_wait_shorter_than_source_budget` переехал сюда же (в
коммите без `pool_timeout` он был бы красным) и читает публичный
`engine.pool.timeout()` вместо приватного `pool._timeout`.

Refs #3083, #3408
2026-09-12 02:23:09 +05:00
..
__init__.py feat: add tradein-mvp subproject (Trade-In Estimator под /trade-in) 2026-05-21 00:25:39 +03:00
anon_session.py feat(mera/b2c): анти-абуз для анонимного трафика — этап 2 из 8 (#2546) 2026-08-25 16:27:02 +00:00
auth.py test(tradein): прод-конфигурация ролей в приёмке #3316 + компромисс фолбэка 2026-09-02 14:59:14 +05:00
auth_db.py fix(#3194): hide_parameters=True на всех движках, include_local_variables=False у scheduler 2026-08-30 14:53:41 +05:00
config.py feat(tradein/proxy): прогон знает свой узел, а снятый бан перестаёт стирать историю (#3404) 2026-09-06 13:05:20 +03:00
db.py fix(mera): pool_timeout 30→5 с — отдельным коммитом, с триггером отката 2026-09-12 02:23:09 +05:00
fdw.py chore(tradein/geocoder): удалить Яндекс-геокодер (#2593) 2026-07-31 21:22:09 +03:00
http_errors.py fix(mera/public): Infinity/NaN во входе — 422, и бюджет считает такие запросы 2026-08-30 00:11:56 +05:00
log_scrub.py fix(tradein): маскировать секрет и в параметрах с префиксом (#3154) 2026-09-05 23:03:16 +05:00
password.py fix(tradein/auth): отказ по насыщению — до выборки из БД и с агрегированным следом (#2715) (#2734) 2026-08-06 14:27:26 +00:00
public_request.py fix(mera/b2c): семь дефектов публичного периметра, найденных состязательным ревью 2026-08-16 10:01:47 +03:00
ratelimit.py fix(tradein/payments): тело нотификации не течёт в мониторинг и аудит, повторы банка не отбиваются лимитом 2026-08-07 16:17:59 +03:00
rbac.py fix(rbac): анониму на admin-префиксе отвечать 404, а не 401 2026-09-06 00:51:09 +05:00
request_audit.py fix(tradein/payments): тело нотификации не течёт в мониторинг и аудит, повторы банка не отбиваются лимитом 2026-08-07 16:17:59 +03:00
shutdown.py feat(tradein/scraper): cooperative SIGTERM-drain for graceful deploy (#1182 Phase 2) 2026-06-28 19:52:09 +03:00
version.py feat(tradein): версионирование продукта — единый источник, подвал, PDF, /versions (#2824) 2026-08-10 16:00:54 +00:00