fix(tradein/proxy): самовосстановление пула и запасной прокси чужой affinity (#2600) #2609
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2609
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-proxy-pool-self-healing"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
run_proxy_healthcheckтеперь перепроверяет и disabled-узлы (реже —DISABLED_RECHECK_MINUTES=60либо если ни разу не проверялся); успешная проба реанимирует узел (enabled=true,consecutive_fails=0) и инкрементит новый счётчикrevived. Без этого auto-disable поDISABLE_THRESHOLDнеобратим: транзиентный сбой = вечный приговор (замерено на проде — id 9/11 выключены, но физически рабочие; id 10 enabled, но 502).acquire(provider)при пустой выборке поprovider_affinity IN (:provider, 'any')вторым заходом берёт любой свободный здоровый прокси ЛЮБОЙ affinity (WARNING-лог), чтобы не морить источник голодом при живых свободных узлах чужой affinity. Приоритет своей affinity сохранён (тест на это есть)._probe_proxyклассифицирует неуспех (timeout/connect_error/http_error/other) вfail_kind, которыйmark_healthпринимает опциональным параметром — используется ТОЛЬКО для логирования. Полноценное разделение порогов (транзиент vs перманентный бан — разная скорость инкремента/disable) требует более глубокой переработки модуля (per-fail_kind счётчики) и намеренно не сделано в рамках этого PR — см. docstringmark_healthв коде.Scope
Только
tradein-mvp/backend/app/services/proxy_pool.py+ тесты. НЕ трогает скрейперы/browser_fetcher.py/providers/_proxy.py(доведение сигнала бана до пула — отдельная задача, п.2 issue), НЕ трогаетrotate_url/ротацию IP (п.5 issue, нет ключа API), НЕ меняетprovider_affinityсуществующих строк, без миграций.Falsification (тесты падают на старом коде)
Было: тестовый модуль падал на
ImportError: cannot import name 'DISABLED_RECHECK_MINUTES'приgit stashреализации (тесты оставлены) — 0 passed / collection error.Стало:
21 passedвtests/services/test_proxy_pool.py.Test plan
tests/services/test_proxy_pool.py— 21/21 passed (offline, FakeSession)pytestвtradein-mvp/backend: 3018 passed, 9 skipped, 1 known pre-existing fail (test_search_api.py::test_search_cache_hit, 401 от RBAC-мидлвари, не связан с этим PR)ruff check— clean на обоих файлахRefs #2600