fix(tradein/yandex): чекпоинт combo ставился до save_listings, не после (#3170) #3173

Merged
bot-backend merged 1 commit from fix/3170-yandex-combo-checkpoint into main 2026-08-27 21:59:39 +00:00
Collaborator

Закрывает #3170 — дефект был уже в main и работал на проде.

Что было

_on_combo внутри run_yandex_city_sweep ставил done_combos.add(combo_label) до save_listings. Отказ сохранения перехватывался, логировался, делался rollback — и прогон продолжался, но combo уже был помечен пройденным и уходил в done_buckets.

Следующий прогон такой combo пропускал — навсегда и молча: прогон завершался со статусом done, счётчики показывали успех, просто сегмент выдачи (сегмент × комнатность × ценовой диапазон) не собирался никогда.

Что стало

Локальный флаг _saved_ok. Пустая выдача — валидно пройденный combo (отмечается). Непустая — отмечается только после успешного save_listings. Heartbeat пишется безусловно в обоих случаях, иначе reap_zombies посчитал бы живой прогон мёртвым.

Тот же приём уже стоит у трёх соседей: _saved_ok в run_avito_newbuilding_sweep, _anchor_ok в run_avito_city_sweep, _mark_bucket(complete) в run_cian_full_load.

Точка подхвата проверена отдельно

skip_combos = set(_prev_counters.get("done_buckets", [])) — членство в множестве, не максимум. Дыра в чекпоинте здесь не перепрыгивается, второго дефекта нет. (В avito_newbuilding_sweep он был и закрыт в #3169.)

Проверка

Тест проверен на обратимость: с возвращённым дефектом падает (combo с упавшим save попал в чекпоинт — покрытие потеряно молча), с фиксом проходит. Вместе с регрессией #30746 passed. ruff format/check чисто, CRLF сохранён побайтово.

Refs #3170, #3074, #2989

Закрывает #3170 — дефект был уже в `main` и работал на проде. ## Что было `_on_combo` внутри `run_yandex_city_sweep` ставил `done_combos.add(combo_label)` **до** `save_listings`. Отказ сохранения перехватывался, логировался, делался `rollback` — и прогон продолжался, но combo уже был помечен пройденным и уходил в `done_buckets`. Следующий прогон такой combo пропускал — навсегда и молча: прогон завершался со статусом `done`, счётчики показывали успех, просто сегмент выдачи (сегмент × комнатность × ценовой диапазон) не собирался никогда. ## Что стало Локальный флаг `_saved_ok`. Пустая выдача — валидно пройденный combo (отмечается). Непустая — отмечается только после успешного `save_listings`. Heartbeat пишется безусловно в обоих случаях, иначе `reap_zombies` посчитал бы живой прогон мёртвым. Тот же приём уже стоит у трёх соседей: `_saved_ok` в `run_avito_newbuilding_sweep`, `_anchor_ok` в `run_avito_city_sweep`, `_mark_bucket(complete)` в `run_cian_full_load`. ## Точка подхвата проверена отдельно `skip_combos = set(_prev_counters.get("done_buckets", []))` — членство в множестве, не максимум. Дыра в чекпоинте здесь не перепрыгивается, второго дефекта нет. (В `avito_newbuilding_sweep` он был и закрыт в #3169.) ## Проверка Тест проверен на обратимость: с возвращённым дефектом падает (`combo с упавшим save попал в чекпоинт — покрытие потеряно молча`), с фиксом проходит. Вместе с регрессией #3074 — `6 passed`. ruff format/check чисто, CRLF сохранён побайтово. Refs #3170, #3074, #2989
bot-backend added 1 commit 2026-08-27 21:50:53 +00:00
fix(tradein/yandex): чекпоинт combo ставился до save_listings, не после
All checks were successful
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m40s
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 11s
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
dc793e8701
_on_combo в run_yandex_city_sweep делал done_combos.add(combo_label) ДО
вызова save_listings. Отказ save_listings перехватывается (осознанно —
одна упавшая единица не должна ронять весь sweep) и логируется, но combo
уже был отмечен пройденным и уходил в heartbeat done_buckets. Следующий
resume брал skip_combos из done_buckets (членство в множестве — само по
себе корректно, не трогал) и пропускал этот combo навсегда: молча, прогон
завершался штатно, просто сегмент выдачи не собирался никогда.

Тот же инвариант "отмечаем пройденным только после успешного save", что
уже есть у страницы в run_avito_newbuilding_sweep (_saved_ok), якоря в
run_avito_city_sweep (_anchor_ok) и бакета в run_cian_full_load
(_mark_bucket) — применил к combo. Heartbeat пишется в любом случае
(и при отказе save тоже), иначе reap_zombies посчитает живой прогон
мёртвым.

Тесты: test_3170_yandex_combo_checkpoint.py — combo с упавшим save не
попадает в done_buckets, успешный (включая пустую выдачу) — попадает.
Обратимость проверена: с возвращённым дефектом (git stash) первый тест
красный, со снятым — зелёный вместе с существующим test_3074_yandex_
sweep_checkpoint.py (6/6).
bot-backend merged commit da90c1599c into main 2026-08-27 21:59:39 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#3173
No description provided.