fix(tradein/geocode): бюджет прогона проверяется внутри батча (#3151) #3152

Merged
bot-backend merged 1 commit from fix/3151-geocode-budget-inside-batch into main 2026-08-27 16:16:32 +00:00
Collaborator

Summary

  • дедлайн прогона передаётся в geocode_missing_listings и проверяется на каждом адресе, а не только между батчами
  • отдельный флаг GeocodeBackfillResult.budget_exhausted — на оборванном батче addresses_total равен размеру выборки, поэтому ветка дренажа (addresses_total < batch_size) остановить цикл не может
  • поведение без дедлайна (deadline_monotonic=None, вызов из админ-эндпоинта) не меняется

Почему это стало заметно только сейчас

До общего ограничителя темпа Nominatim (#2953) адрес стоил ~1.9 с, полный батч ~6 минут, перебор бюджета терялся в шуме. После — 4.5 с в среднем и до 33 с на трудном хвосте (tier-1 + до 4 typo-вариантов под паузой 1 с, плюс retry×3). Прогон 5017 (27.08) при budget_sec=1800 шёл 3150 с и вышел по дренажу, а не по бюджету.

Test plan

  • 5 новых тестов в tests/tasks/test_geocode_missing.py
  • каждая несущая проверка падает без своей правки — снимал ветку в обёртке (stops_on_budget_exhausted_flag → FAILED) и проверку внутри цикла (stops_immediately_on_expired_deadline, breaks_mid_batch_when_deadline_passes → FAILED)
  • pytest tests/tasks/test_geocode_missing.py — 37 passed локально
  • ruff check app tests — clean

Closes #3151
Refs #2953

## Summary - дедлайн прогона передаётся в `geocode_missing_listings` и проверяется **на каждом адресе**, а не только между батчами - отдельный флаг `GeocodeBackfillResult.budget_exhausted` — на оборванном батче `addresses_total` равен размеру выборки, поэтому ветка дренажа (`addresses_total < batch_size`) остановить цикл не может - поведение без дедлайна (`deadline_monotonic=None`, вызов из админ-эндпоинта) не меняется ## Почему это стало заметно только сейчас До общего ограничителя темпа Nominatim (#2953) адрес стоил ~1.9 с, полный батч ~6 минут, перебор бюджета терялся в шуме. После — 4.5 с в среднем и до 33 с на трудном хвосте (tier-1 + до 4 typo-вариантов под паузой 1 с, плюс `retry×3`). Прогон 5017 (27.08) при `budget_sec=1800` шёл **3150 с** и вышел по дренажу, а не по бюджету. ## Test plan - [x] 5 новых тестов в `tests/tasks/test_geocode_missing.py` - [x] каждая несущая проверка падает без своей правки — снимал ветку в обёртке (`stops_on_budget_exhausted_flag` → FAILED) и проверку внутри цикла (`stops_immediately_on_expired_deadline`, `breaks_mid_batch_when_deadline_passes` → FAILED) - [x] `pytest tests/tasks/test_geocode_missing.py` — 37 passed локально - [x] `ruff check app tests` — clean Closes #3151 Refs #2953
bot-backend added 1 commit 2026-08-27 16:11:23 +00:00
fix(tradein/geocode): бюджет прогона не был потолком — проверялся только между батчами
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (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 4m45s
CI / backend-tests (pull_request) Has been skipped
8cdb195e18
`run_geocode_missing_listings` рекламирует `budget_sec` как максимальное время
прогона, но проверка стояла после возврата из батча. Внутри батча цикл шёл по
всем 200 адресам и часов не смотрел, то есть фактический потолок был
`budget_sec + один полный батч`.

Замер: прогон 5017 (27.08, `budget_sec=1800`) шёл 3150 с — 175 % бюджета, и
вышел не по бюджету, а по дренажу: бюджетная ветка за 52 минуты не выполнилась
ни разу.

Пока адрес стоил ~1.9 с это терялось в шуме. После общего ограничителя темпа
Nominatim (#2953) средняя цена 4.5 с, а на трудном хвосте (tier-1 + до 4
typo-вариантов под паузой 1 с, плюс retry×3) — до 33 с. Полный батч из таких
адресов уезжает на ~110 минут поверх бюджета, при окне расписания 06:00–09:00.

Дедлайн теперь передаётся В батч и проверяется на каждом адресе. Оборванный
батч — штатный исход: `geocode_tried_at` проставлен только у обработанных пар,
остальные попадут в выборку следующего прогона.

Отдельный флаг `budget_exhausted` нужен потому, что `addresses_total` на
оборванном батче равен размеру ВЫБОРКИ (== batch_size) — ветка дренажа
`addresses_total < batch_size` не сработала бы, и обёртка крутила бы цикл
дальше. Тест на это падает без флага (проверено снятием ветки).

Тесты: 5 новых, все три несущие проверки падают без соответствующей правки.
37 passed локально.

Closes #3151
bot-backend merged commit c2d890ff4e into main 2026-08-27 16:16:32 +00:00
bot-backend deleted branch fix/3151-geocode-budget-inside-batch 2026-08-27 16:16:33 +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#3152
No description provided.