-- 258_houses_imv_transient_attempts.sql -- Счётчик подряд идущих временных отказов домовой оценки Авито (эпик #2674). -- -- ЗАЧЕM. imv_status='transient_error' был состоянием БЕЗ ВЫХОДА: очередь -- backfill'а выбирает ровно один статус за прогон (only_status, по умолчанию -- 'pending'), и за всю историю (41 прогон, 26.06–11.08) ни один не был запущен -- с другим значением. На 12.08.2026 в этом статусе лежали 1390 домов, 1337 из -- них — с причиной «503/500 от tradein-browser:3000/fetch-json» или «All -- connection attempts failed», то есть с ИНФРАСТРУКТУРНОЙ причиной, которой -- больше нет (сайдкар починен #2698; за 7 суток до 12.08 в его access-логе -- 108 из 108 POST /fetch-json = 200). -- -- Сервис теперь отдаёт часть пакета на повтор transient_error автоматически -- (house_imv_backfill._RETRY_QUEUE_SQL). Этот счётчик — условие ВЫХОДА из -- повтора: дом, падающий по своей причине, а не по инфраструктурной, перестаёт -- занимать слот пакета после _MAX_TRANSIENT_ATTEMPTS (3) подряд. -- -- Наблюдаемость НЕ переименовывается: статус остаётся 'transient_error', -- прежние разрезы по imv_status/imv_error_reason работают как работали, а -- «застряли окончательно» — это -- SELECT count(*) FROM houses -- WHERE imv_status='transient_error' AND imv_transient_attempts >= 3; -- -- Индекс не добавляем: houses_imv_status_idx (064) уже частичный по -- imv_status IN ('pending','transient_error') с сортировкой по -- last_imv_attempt_at — фильтр по счётчику остаётся остаточным условием на -- выборке в тысячи строк. BEGIN; SET LOCAL lock_timeout = '5s'; ALTER TABLE houses ADD COLUMN IF NOT EXISTS imv_transient_attempts smallint NOT NULL DEFAULT 0; COMMENT ON COLUMN houses.imv_transient_attempts IS 'Сколько раз подряд домовая IMV-оценка падала в transient_error. ' 'Растёт только на transient_error, обнуляется успехом. ' '>= 3 — дом больше не берётся в автоматический повтор (эпик #2674).'; COMMIT;