fix(scraper-kit): метка дрейна interrupted=1 во всех city-свипах — yandex/cian/newbuilding больше не объявляют недоделанный обход готовым #3346

Merged
bot-backend merged 1 commit from fix/3333-drain-mark-all-sweeps into main 2026-09-05 18:03:05 +00:00
Collaborator

Closes #3333 (отпочковано из #3319/#3330). После #3330 резюм подхватывает done-прогоны только с меткой interrupted, но её писал один avito_city_sweep.

Что сделано

Та же идиома, что у avito (_ckpt(interrupted=1)), у трёх функций без хелпера — инлайн-payload {**counters.to_dict(), "interrupted": 1} в оба вызова дрейн-ветки (heartbeat + mark_done):

провайдер дрейн-ветка резюм существует
newbuilding run_avito_newbuilding_sweep, shutdown_requested() до SERP-фазы да: done_buckets = номера страниц, start_page = max+1
yandex run_yandex_city_sweep, граница якоря да: combo-метки, skip_combos (оговорка: подхват только при единственном якоре — прод-режим ровно такой)
cian run_cian_city_sweep, граница якоря да: имена якорей, _skip_anchors

Метка у всех трёх — рабочая, не диагностическая. done_buckets в дрейн-payload намеренно НЕ добавлен: heartbeat мержит jsonb, записанные единицы обхода переживают финализатор, а у multi-anchor yandex пустой список на первом якоре затёр бы унаследованный при claim чекпоинт. scheduler.py / avito_city_sweep / app/tasks — не тронуты.

Тесты

test_3333_drain_mark_all_sweeps.py (3 провайдера + анти-цикл): в составе 354 passed, 1 skipped (-k sweep/scheduler/checkpoint/resume/drain). Фальсификация — откат ТОЛЬКО cian-хунка: cian: оборванный дрейном прогон неотличим от полного обхода — assert None == 1, остальные зелёные.

Прод-приёмка после деплоя

Дрейн-прогон yandex/cian/nb (следующий деплой их прервёт) → counters.interrupted=1, следующий claim → resume_reason: ok.

Closes #3333 (отпочковано из #3319/#3330). После #3330 резюм подхватывает `done`-прогоны только с меткой `interrupted`, но её писал один avito_city_sweep. ## Что сделано Та же идиома, что у avito (`_ckpt(interrupted=1)`), у трёх функций без хелпера — инлайн-payload `{**counters.to_dict(), "interrupted": 1}` в оба вызова дрейн-ветки (heartbeat + mark_done): | провайдер | дрейн-ветка | резюм существует | |---|---|---| | newbuilding | `run_avito_newbuilding_sweep`, `shutdown_requested()` до SERP-фазы | да: `done_buckets` = номера страниц, `start_page = max+1` | | yandex | `run_yandex_city_sweep`, граница якоря | да: combo-метки, `skip_combos` (оговорка: подхват только при единственном якоре — прод-режим ровно такой) | | cian | `run_cian_city_sweep`, граница якоря | да: имена якорей, `_skip_anchors` | Метка у всех трёх — рабочая, не диагностическая. `done_buckets` в дрейн-payload намеренно НЕ добавлен: heartbeat мержит jsonb, записанные единицы обхода переживают финализатор, а у multi-anchor yandex пустой список на первом якоре затёр бы унаследованный при claim чекпоинт. scheduler.py / avito_city_sweep / app/tasks — не тронуты. ## Тесты `test_3333_drain_mark_all_sweeps.py` (3 провайдера + анти-цикл): в составе `354 passed, 1 skipped` (-k sweep/scheduler/checkpoint/resume/drain). Фальсификация — откат ТОЛЬКО cian-хунка: `cian: оборванный дрейном прогон неотличим от полного обхода — assert None == 1`, остальные зелёные. ## Прод-приёмка после деплоя Дрейн-прогон yandex/cian/nb (следующий деплой их прервёт) → `counters.interrupted=1`, следующий claim → `resume_reason: ok`.
bot-backend added 1 commit 2026-09-05 17:47:38 +00:00
fix(scraper-kit): метка дрейна interrupted=1 во всех city-свипах (#3333)
All checks were successful
CI Trade-In / 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 / changes (pull_request) Successful in 10s
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 5m13s
ac11156f7d
После #3319 резюм подхватывает 'done'-прогоны только с counters.interrupted
(_drained_done в scheduler._resume_decision), но ставил метку ровно один
avito_city_sweep. У yandex, cian и newbuilding SIGTERM-drain финализировался
чистым 'done' с частичными счётчиками: оборванный деплоем обход неотличим от
полного и из резюма выпадал, хотя чекпоинт done_buckets есть у всех трёх
(combo-метки / имена якорей / номера страниц).

done_buckets в дрейн-payload не добавляю: heartbeat мержит jsonb, уже
записанные единицы обхода переживают финализатор, а пустой список у
multi-anchor yandex затёр бы унаследованный при claim чекпоинт.
bot-backend merged commit 4044acccf0 into main 2026-09-05 18:03:05 +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#3346
No description provided.