Вернуть домклик-свипы Москвы и области #3594

Merged
lekss361 merged 1 commit from feat/domclick-msk-reenable into main 2026-09-17 14:03:01 +00:00
Owner

Отменяет миграцию 308 (#3567) — причина выключения устранена в #3592.

Почему было выключено

Свип копил лоты в памяти и сохранял их одним save_listings после всех шести корзин. Снятие по watchdog теряло всё собранное, а чекпоинт при этом помечал корзины пройденными, и следующий прогон пропускал их через skip_buckets. На выдаче размером с Москву (≈23 690 лотов вторички против ≈6 300 у ЕКБ) снятие было гарантировано — итоговый сбор равнялся нулю навсегда.

Почему можно возвращать

#3592: save_listings зовётся из колбэка on_bucket сразу после каждой успешной корзины, туда же переехал чекпоинт. done_buckets теперь означает «собрано и сохранено», корзина без сохранённых строк в него не попадает, а снятие по watchdog больше не теряет собранное. Тем же колбэком добавлена кооперативная отмена по корзинам.

interval_days: 1 вместо 3

Полный проход Москвы в одно окно watchdog'а по-прежнему не помещается — замер run 7344: 2 корзины из 6 за два часа. Добор идёт ротацией стартовой корзины (start_bucket_index = run_id % 6) плюс skip_buckets из чекпоинта: каждый прогон берёт корзины, которых ещё нет в done_buckets.

При суточном такте шесть корзин закрываются примерно за трое суток, при трёхсуточном — за девять. Корпус живёт 14 суток (LISTINGS_FRESH_DAYS), и девять на полный оборот не оставляли бы запаса на пропуски из-за QRATOR-банов.

watchdog_sec намеренно не задаётся

Override в коде есть (#3592, читается из default_params обоими хендлерами), но поднимать таймаут до замера нечем обосновать: с инкрементальным сохранением ранний снос перестал быть потерей, а более длинный прогон дольше держит один из двух узлов provider_affinity='any' (id 13 и 14), за которые конкурирует cian. Сначала смотрим реальный выход за прогон, потом решаем про таймаут.

Окна

Не меняются: Москва 0-3, область 9-12 (разведены миграцией 307 / #3546), ЕКБ 3-6. Ни одно окно не содержит двух домклик-строк — за нарушение этого условия 17.09 ЕКБ-свип run 7339 отбился banned за 0 секунд.

Чекпоинт прогонов 7333/7344 сбрасывать не нужно: у обоих buckets_completed пуст, они были задрейнены деплоем ещё до первой завершённой корзины.

Проверка

Сухой прогон на проде под BEGIN … ROLLBACK:

UPDATE 2
 domclick_city_sweep                    | t | 3 |  6 | {"city_id": 4, "pages_per_anchor": 100, "request_delay_sec": 6}
 domclick_city_sweep_moskovskaya_oblast | t | 9 | 12 | {"region_code": 50, "interval_days": 1, ...}
 domclick_city_sweep_moskva             | t | 0 |  3 | {"region_code": 77, "interval_days": 1, ...}
ROLLBACK

ЕКБ-строка не затронута. tests/test_migration_numbering.py → 1 passed, 2 skipped.

Мержить только после того, как #3592 доехал до прода — иначе строки включатся на коде без инкрементального сохранения и снова соберут ноль.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs

Отменяет миграцию 308 (#3567) — причина выключения устранена в #3592. ## Почему было выключено Свип копил лоты в памяти и сохранял их **одним** `save_listings` после всех шести корзин. Снятие по watchdog теряло всё собранное, а чекпоинт при этом помечал корзины пройденными, и следующий прогон пропускал их через `skip_buckets`. На выдаче размером с Москву (≈23 690 лотов вторички против ≈6 300 у ЕКБ) снятие было гарантировано — итоговый сбор равнялся нулю навсегда. ## Почему можно возвращать #3592: `save_listings` зовётся из колбэка `on_bucket` сразу после **каждой** успешной корзины, туда же переехал чекпоинт. `done_buckets` теперь означает «собрано **и** сохранено», корзина без сохранённых строк в него не попадает, а снятие по watchdog больше не теряет собранное. Тем же колбэком добавлена кооперативная отмена по корзинам. ## `interval_days: 1` вместо `3` Полный проход Москвы в одно окно watchdog'а по-прежнему **не помещается** — замер run 7344: 2 корзины из 6 за два часа. Добор идёт ротацией стартовой корзины (`start_bucket_index = run_id % 6`) плюс `skip_buckets` из чекпоинта: каждый прогон берёт корзины, которых ещё нет в `done_buckets`. При суточном такте шесть корзин закрываются примерно за трое суток, при трёхсуточном — за девять. Корпус живёт 14 суток (`LISTINGS_FRESH_DAYS`), и девять на полный оборот не оставляли бы запаса на пропуски из-за QRATOR-банов. ## `watchdog_sec` намеренно не задаётся Override в коде есть (#3592, читается из `default_params` обоими хендлерами), но поднимать таймаут **до замера** нечем обосновать: с инкрементальным сохранением ранний снос перестал быть потерей, а более длинный прогон дольше держит один из **двух** узлов `provider_affinity='any'` (id 13 и 14), за которые конкурирует cian. Сначала смотрим реальный выход за прогон, потом решаем про таймаут. ## Окна Не меняются: Москва 0-3, область 9-12 (разведены миграцией 307 / #3546), ЕКБ 3-6. Ни одно окно не содержит двух домклик-строк — за нарушение этого условия 17.09 ЕКБ-свип run 7339 отбился `banned` за 0 секунд. Чекпоинт прогонов 7333/7344 сбрасывать не нужно: у обоих `buckets_completed` пуст, они были задрейнены деплоем ещё до первой завершённой корзины. ## Проверка Сухой прогон на проде под `BEGIN … ROLLBACK`: ``` UPDATE 2 domclick_city_sweep | t | 3 | 6 | {"city_id": 4, "pages_per_anchor": 100, "request_delay_sec": 6} domclick_city_sweep_moskovskaya_oblast | t | 9 | 12 | {"region_code": 50, "interval_days": 1, ...} domclick_city_sweep_moskva | t | 0 | 3 | {"region_code": 77, "interval_days": 1, ...} ROLLBACK ``` ЕКБ-строка не затронута. `tests/test_migration_numbering.py` → 1 passed, 2 skipped. **Мержить только после того, как #3592 доехал до прода** — иначе строки включатся на коде без инкрементального сохранения и снова соберут ноль. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs
lekss361 added 1 commit 2026-09-17 13:47:50 +00:00
feat(trade-in): вернуть домклик-свипы Москвы и области
All checks were successful
CI Trade-In / changes (pull_request) Successful in 24s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 26s
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
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m19s
f1bad53de7
Миграция 308 выключила их потому, что свип копил лоты в памяти и сохранял одним
save_listings после всех шести корзин: снятие по watchdog теряло всё собранное, а
чекпоинт при этом помечал корзины пройденными. На выдаче размером с Москву
(около 23 690 лотов вторички против 6 300 у ЕКБ) снятие было гарантировано, и
итоговый сбор равнялся нулю навсегда.

PR #3592 это снял: save_listings зовётся из колбэка on_bucket после каждой
успешной корзины, туда же переехал чекпоинт, и корзина без сохранённых строк в
него не попадает.

interval_days = 1 вместо 3: полный проход Москвы в одно окно watchdog'а
по-прежнему не помещается (замер run 7344 — 2 корзины из 6 за два часа). Добор
идёт ротацией стартовой корзины плюс skip_buckets из чекпоинта, и при суточном
такте шесть корзин закрываются примерно за трое суток против девяти при
трёхсуточном. Корпус живёт 14 суток, девять не оставляли бы запаса на пропуски
из-за QRATOR-банов.

watchdog_sec намеренно не задаётся: override в коде есть, но поднимать таймаут до
замера нечем обосновать — с инкрементальным сохранением ранний снос перестал быть
потерей, а длинный прогон дольше держит один из двух узлов affinity='any'.

Окна не меняются: Москва 0-3, область 9-12, ЕКБ 3-6 — ни одно не содержит двух
домклик-строк.

Проверено сухим прогоном на проде под ROLLBACK: UPDATE 2, обе строки enabled=t с
interval_days=1, ЕКБ-строка не затронута.

Claude-Session: https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs
lekss361 merged commit dbac5d4e1c into main 2026-09-17 14:03:01 +00:00
lekss361 deleted branch feat/domclick-msk-reenable 2026-09-17 14:03:01 +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#3594
No description provided.