fix(scraper-kit): пропуск по куке двигает next_run_at на interval_minutes, а не на случайный час завтра #3351

Merged
bot-backend merged 2 commits from fix/3312-defer-interval-minutes into main 2026-09-05 18:22:42 +00:00
Collaborator

Closes #3312. _defer_next_run_at (путь пропуска pre_claim — протухшие куки Циана) читал только interval_dayscompute_next_run_at давал случайный час завтрашних суток; у cian_detail_backfill каденция interval_minutes=360 → после ручного обновления кук сбор подхватывался через сутки-двое вместо шести часов.

Что изменено (scheduler.py, +31/−6)

  • _interval_minutes(params, param=...) — единственный разбор минутной каденции, переиспользован обоими входами (_defer_next_run_at и reschedule_after_minutes, поведение последнего не изменено);
  • _defer_next_run_at: есть interval_minutesnow + max(minutes, _MIN_DEFER_MINUTES); нет → прежний compute_next_run_at(..., interval_days) дословно.

Порог #1522: _MIN_DEFER_MINUTES = 3 * SCHEDULER_TICK_SEC // 60 = 3 мин — выражен через такт, не литералом; 2 тика впритык к границе, при рассинхроне часов планировщика и БД на такт 3 тика гарантируют промах get_due_schedules (pre-check каждую минуту не возвращается).

_resume_decision/дрейн (параллельные PR #3330/#3346), pipeline.py, product_handlers.py — не тронуты.

Тесты

test_defer_respects_interval_minutes_3312.py: 4 кейса (interval_minutes=360 → ~360 мин; порог; без interval_minutes — прежнее; interval_days=7 — прежнее). 132 passed, 1 skipped (-k scheduler/defer/schedule). Фальсификация (откат исходника): ожидали ~360 мин, получили 15:29:50 / ожидали порог 0:03:00, получили 19:53:18 — по значению; порог в тесте выводится из SCHEDULER_TICK_SEC, а не импортируется (первая версия падала ImportError — переписана).

Прод-приёмка

Следующий пропуск cian_detail_backfill по куке → next_run_at ≈ now + 6htradein-scraper).

Closes #3312. `_defer_next_run_at` (путь пропуска pre_claim — протухшие куки Циана) читал только `interval_days` → `compute_next_run_at` давал случайный час завтрашних суток; у `cian_detail_backfill` каденция `interval_minutes=360` → после ручного обновления кук сбор подхватывался через сутки-двое вместо шести часов. ## Что изменено (scheduler.py, +31/−6) - `_interval_minutes(params, param=...)` — единственный разбор минутной каденции, переиспользован обоими входами (`_defer_next_run_at` и `reschedule_after_minutes`, поведение последнего не изменено); - `_defer_next_run_at`: есть `interval_minutes` → `now + max(minutes, _MIN_DEFER_MINUTES)`; нет → прежний `compute_next_run_at(..., interval_days)` дословно. Порог #1522: `_MIN_DEFER_MINUTES = 3 * SCHEDULER_TICK_SEC // 60` = 3 мин — выражен через такт, не литералом; 2 тика впритык к границе, при рассинхроне часов планировщика и БД на такт 3 тика гарантируют промах `get_due_schedules` (pre-check каждую минуту не возвращается). `_resume_decision`/дрейн (параллельные PR #3330/#3346), pipeline.py, product_handlers.py — не тронуты. ## Тесты `test_defer_respects_interval_minutes_3312.py`: 4 кейса (interval_minutes=360 → ~360 мин; порог; без interval_minutes — прежнее; interval_days=7 — прежнее). `132 passed, 1 skipped` (-k scheduler/defer/schedule). Фальсификация (откат исходника): `ожидали ~360 мин, получили 15:29:50` / `ожидали порог 0:03:00, получили 19:53:18` — по значению; порог в тесте выводится из `SCHEDULER_TICK_SEC`, а не импортируется (первая версия падала ImportError — переписана). ## Прод-приёмка Следующий пропуск `cian_detail_backfill` по куке → `next_run_at ≈ now + 6h` (в `tradein-scraper`).
bot-backend added 1 commit 2026-09-05 17:52:18 +00:00
fix(scheduler): defer уважает interval_minutes источника
Some checks failed
CI Trade-In / changes (pull_request) Successful in 14s
CI / changes (pull_request) Successful in 16s
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
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Failing after 5m49s
63e2210abd
_defer_next_run_at (путь пропуска pre_claim — например протухшие куки Циана)
читал только interval_days, поэтому cian_detail_backfill с каденцией 360 мин
после пропуска получал случайный час завтрашних суток: от ~1 до ~47 часов
вместо шести. Ручное обновление кук не давало эффекта ещё сутки.

Разбор interval_minutes вынесен в _interval_minutes и переиспользован
post_claim-хуком reschedule_after_minutes — два входа в одну каденцию.

Нижний порог _MIN_DEFER_MINUTES = 3 тика планировщика сохраняет #1522:
defer обязан пережить несколько get_due_schedules, иначе pre-check снова
гоняется каждую минуту.

Refs #3312, #1522
bot-backend added 1 commit 2026-09-05 18:15:50 +00:00
Merge branch 'main' into fix/3312-defer-interval-minutes
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / changes (pull_request) Successful in 14s
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
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m34s
7322615868
bot-backend merged commit 0e4a227a5a into main 2026-09-05 18:22:42 +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#3351
No description provided.