chore(tradein): последние обходы пула прокси — admin cian-login/domclick-debug через фабрику; снят костыль _PoolCurlConfig (#3197, #3386) #3409

Merged
bot-backend merged 2 commits from chore/backend-pool-wiring-tails into main 2026-09-07 11:04:08 +00:00
Collaborator

Хвосты #3197 (часть 1 — закрывает список точек) и #3386 (п. _PoolCurlConfig). Closes #3197.

1. admin.py — cian-login (~511) и domclick-detail-debug (~702) строили BrowserFetcher(source=…, endpoint=…) без пула → env-фолбэк на выключенный узел 9. Переведены на образец :1947: build_browser_fetcher(RealScraperConfig(), "<source>", proxy_provider=_kit_proxy_provider()); импорт BrowserFetcher в admin.py снят (патч-поинт в test_admin_cian_session_endpoints.py перенаправлен на build_browser_fetcher); докстринг фабрики _base.py больше не перечисляет эти ручки как обходы. Аудит BrowserFetcher( вне тестов: все оставшиеся конструкции — с провайдером/use_pool/environment или в узаконенной config=None-ветке офлайн-тестов.

2. cian_price_history.py_PoolCurlConfig форсировал use_proxy_pool_curl=True из-за отсутствия env у backend; после #3387 (USE_PROXY_POOL_CURL: "true" у сервиса backend, compose :341) избыточен и докстринг неверен → RealScraperConfig() напрямую. Тест test_2830 …_despite_flag_off проверял сам костыль — переименован в …_takes_pool_node (флаг включён), добавлен …_honours_flag_off (флаг выключен → пул не трогаем; на main красный: assert ['cian'] == []).

Тесты: tests/test_3197_admin_debug_browser_pool_wiring.py (2×2: proxy_provider is not None, use_pool/environment из конфига). Фальсификация (git apply -R): assert None is not None ×4 + при выключенном флаге пул не трогаем: assert ['cian'] == [] — 5 failed. Восстановлено.

Прогоны: полный backend 5623 passed, 35 skipped (rc=0); ruff OK.

Приёмка на проде: POST /admin/scrape/domclick/debug/detail-fetch изнутри контейнера берёт узел с affinity domclick (раньше — узел 9 → InvalidIP); cian-price-history слушается USE_PROXY_POOL_CURL.

Хвосты #3197 (часть 1 — закрывает список точек) и #3386 (п. `_PoolCurlConfig`). Closes #3197. **1. admin.py** — cian-login (`~511`) и domclick-detail-debug (`~702`) строили `BrowserFetcher(source=…, endpoint=…)` без пула → env-фолбэк на выключенный узел 9. Переведены на образец `:1947`: `build_browser_fetcher(RealScraperConfig(), "<source>", proxy_provider=_kit_proxy_provider())`; импорт `BrowserFetcher` в admin.py снят (патч-поинт в `test_admin_cian_session_endpoints.py` перенаправлен на `build_browser_fetcher`); докстринг фабрики `_base.py` больше не перечисляет эти ручки как обходы. Аудит `BrowserFetcher(` вне тестов: все оставшиеся конструкции — с провайдером/`use_pool`/`environment` или в узаконенной `config=None`-ветке офлайн-тестов. **2. cian_price_history.py** — `_PoolCurlConfig` форсировал `use_proxy_pool_curl=True` из-за отсутствия env у backend; после #3387 (`USE_PROXY_POOL_CURL: "true"` у сервиса backend, compose `:341`) избыточен и докстринг неверен → `RealScraperConfig()` напрямую. Тест `test_2830 …_despite_flag_off` проверял сам костыль — переименован в `…_takes_pool_node` (флаг включён), добавлен `…_honours_flag_off` (флаг выключен → пул не трогаем; на main красный: `assert ['cian'] == []`). **Тесты:** `tests/test_3197_admin_debug_browser_pool_wiring.py` (2×2: `proxy_provider is not None`, `use_pool`/`environment` из конфига). **Фальсификация** (`git apply -R`): `assert None is not None` ×4 + `при выключенном флаге пул не трогаем: assert ['cian'] == []` — 5 failed. Восстановлено. **Прогоны:** полный backend `5623 passed, 35 skipped` (rc=0); ruff OK. **Приёмка на проде:** `POST /admin/scrape/domclick/debug/detail-fetch` изнутри контейнера берёт узел с affinity domclick (раньше — узел 9 → `InvalidIP`); `cian-price-history` слушается `USE_PROXY_POOL_CURL`.
bot-backend added 1 commit 2026-09-06 12:24:27 +00:00
chore(tradein/proxy): последние две ручки admin.py — через фабрику фетчера; снят форс pool-режима у cian-history (#3197, #3386)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 10s
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 5m5s
8761602e9b
Два хвоста одной темы — проводка пула прокси в контейнере backend.

#3197: `cian-login` и `domclick-detail-debug` были последними прямыми
конструкциями `BrowserFetcher(source=, endpoint=)` мимо `build_browser_fetcher`.
Без `proxy_provider`/`use_pool`/`environment` сайдкар брал свой env-узел
`SCRAPER_PROXY_URL` (на проде выключенный узел 9: 407 → camoufox `InvalidIP`), а
прод-отказ «пул пуст» (#2616) на этих путях был мёртв — он смотрит на
`environment`, который до конструктора не доезжал. Соседи по эпику уже переведены
(#3382 cian, #3389 yandex). Прямых конструкций без провайдера вне тестов больше
не осталось: остальные (backfill-задачи, pipeline) пул получают своими kwargs,
а `endpoint=None`-ветки providers — это документированный `config=None` для
офлайн-тестов.

#3386: `_PoolCurlConfig` в `cian_price_history` форсил `use_proxy_pool_curl=True`,
потому что у контейнера `backend` не было переменной. #3387 задал
`USE_PROXY_POOL_CURL: "true"` сервису `backend` в compose — зашитая константа
стала лишней и делала рубильник неотключаемым ровно на этом пути (докстринг при
этом описывал уже неверную причину). Теперь `RealScraperConfig()` напрямую.

Тесты меряют значения, а не наличие kwarg'а: на откате исходников красные
4 параметризации нового `test_3197_admin_debug_browser_pool_wiring`
(`assert None is not None` — провайдер не передан) и
`test_price_history_honours_flag_off` (`assert ['cian'] == []` — пул дёргался при
выключенном флаге).
Author
Collaborator

Code-review (06.09): ⚠️ — domclick-debug и снятие _PoolCurlConfig чистые (kwargs не потеряны, compose-флаг у backend подтверждён на main, off-тест различает env-путь от «ничего не делал»); cian-login — фикс декоративный: /login сайдкара proxy-override не принимает (server.py:2814-2817, _post_login не кладёт proxy), аренда бралась впустую, а при пустом пуле в production ручка восстановления отдавала бы 502 Browser login failed из-за NoProxyAvailableError. Доработка: на cian-login провайдер не передавать, честный комментарий, тест «при пустом пуле ручка не 502» (красный на 8761602e). Проводка пула в /login сайдкара — #3410.

Code-review (06.09): ⚠️ — domclick-debug и снятие `_PoolCurlConfig` чистые (kwargs не потеряны, compose-флаг у backend подтверждён на main, off-тест различает env-путь от «ничего не делал»); **cian-login — фикс декоративный**: `/login` сайдкара proxy-override не принимает (`server.py:2814-2817`, `_post_login` не кладёт `proxy`), аренда бралась впустую, а при пустом пуле в production ручка восстановления отдавала бы `502 Browser login failed` из-за `NoProxyAvailableError`. Доработка: на cian-login провайдер не передавать, честный комментарий, тест «при пустом пуле ручка не 502» (красный на 8761602e). Проводка пула в `/login` сайдкара — #3410.
Light1YT added 1 commit 2026-09-06 12:54:20 +00:00
chore(#3197): cian-login — без холостой аренды и ложного отказа (/login сайдкара override не берёт); честные докстринги
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
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 5m7s
f4d174283a
Code-review хвоста #3197: на `cian-login` аренда из пула не доходила до сайдкара.
`BrowserFetcher._post_login` не кладёт `payload["proxy"]` (это делают только
`fetch`/`fetch_json`), а на приёме `login_handler` (browser/server.py:2814-2817)
зовёт `_no_live_proxy(provider, None)` и `_ensure_browser(provider)` без override —
`/login` proxy-override не принимает вовсе. Lease брался в `__aenter__` и
освобождался в `__aexit__` без пользы и без health-вердикта по узлу.

Хуже холостого хода: при пустом пуле в production `_acquire_lease` поднимает
`NoProxyAvailableError` ДО POST, `cian_auto_login` ловит любое `Exception` →
`502 Browser login failed`. То есть единственная ручка ВОССТАНОВЛЕНИЯ cian-сессии
отказывала ровно во время инцидента с пулом. Комментарий в admin.py при этом
утверждал, что фикс закрывает InvalidIP на логине — неправда.

Убран `proxy_provider=` (фабрика остаётся ради endpoint/environment из одного
места). `use_pool` без провайдера фетчер игнорирует сам — `_acquire_lease`:
`use_pool AND provider is not None` — поэтому ни аренды, ни прод-отказа.
`domclick-detail-debug` не тронут: он ходит через `fetch`, где override реально
кладётся в тело и читается сайдкаром — там #3197 остаётся настоящим фиксом.

Тесты для cian обратные по значению и падают на HEAD ветки:
`test_cian_auto_login_does_not_lease_from_pool` (провайдер не передан, `acquire`
не вызван) и `test_cian_auto_login_survives_empty_pool_in_production` (пустой пул
на проде не отдаёт 502). Стаб cian — подкласс настоящего `BrowserFetcher`, чтобы
второе утверждение шло через реальный `_acquire_lease`, а не через заглушку.

Follow-up (отдельной задачей): сайдкар `/login` не принимает proxy override →
логин cian всегда с env-узла (сейчас выключенный узел 9).
bot-backend merged commit 278f8055a4 into main 2026-09-07 11:04:08 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3409
No description provided.