fix(tradein/imv): «временная» ошибка снова временная — 1390 домов возвращаются в очередь #2843

Merged
bot-backend merged 1 commit from fix/house-imv-retry-stuck into main 2026-08-12 16:06:25 +00:00

1 commit

Author SHA1 Message Date
2b7831d1d8 fix(tradein/imv): «временная» ошибка снова временная — 1390 домов возвращаются в очередь
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
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 / 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 4m21s
Очередь домовой IMV-оценки выбирает РОВНО ОДИН imv_status за прогон
(only_status, дефолт 'pending'). Повтор существовал только как значение этого
параметра — и за всю историю (41 прогон, 26.06–11.08) его не передал ни один
вызов. Дома, упавшие по инфраструктурной причине, которой больше нет (503/500
от браузерного сайдкара, #2698; за 7 суток до 12.08 в его access-логе 108 из
108 POST /fetch-json = 200), оставались в 'transient_error' навсегда: 1390 штук
на 12.08.2026, у всех есть и адрес, и параметры.

Что сделано:

1. Отдельная retry-очередь на половине пакета. Не OR к основной выборке: у
   pending last_imv_attempt_at всегда NULL, поэтому при общем
   ORDER BY ... NULLS FIRST повтор ждал бы опустошения pending (~5.7 тыс. домов
   ≈ год). Недобор retry-очереди возвращается pending — пакет не простаивает.
   Явный only_status отключает автоповтор: ручной запрос оператора обрабатывает
   ровно тот статус, который попросили, включая исчерпавшие лимит дома.

2. Выход из повтора — счётчик imv_transient_attempts (миграция 257), растёт
   только на transient_error, обнуляется успехом, порог 3. Число из замера:
   после починки сайдкара доля отказов на попытку 2/27 и 3/25 (прогоны
   3708/3467) ≈ 10%, то есть порог стоит максимум ~115 слотов ВСЕГО. Статус не
   переименовывается: «застряли окончательно» = transient_error AND
   imv_transient_attempts >= 3.

3. Половина пакета отдана повтору не за счёт pending: дома, по которым запрос к
   площадке невозможен, теперь помечаются no_params одним запросом до пакета
   (тот же вердикт и те же строки причин, что у поштучного пути). На проде это
   2276 домов из 6533 в очередях — 45 прогонов расписания (~136 суток) уходило
   на то, чтобы поштучно выяснить то, что видно в SQL. До правки до площадки
   доходили 17 домов из 50 (замер головы очереди 12.08), после — 50 из 50.

Пропускная способность (пакет 50 / 3 суток): pending 3218 + повтор 1039 после
премарка опустошаются за ~88 тактов (~264 суток) против 103 тактов (~309 суток)
на одном pending сейчас и «никогда» для 1390 застрявших.

Refs #2674
2026-08-12 20:54:12 +05:00