fix(ptica): WAF-блок прерывает backfill_parcel_geom, а не гонит его дальше по кварталам (#2464) #2969

Merged
bot-backend merged 1 commit from fix/2464-backfill-waf-abort into main 2026-08-20 10:34:27 +00:00
Collaborator

Пункт эпика #2464: bulk_harvest.py:554.

Комментарий обещал то, чего код не делал

except Exception as e:
    # Один сбойный квартал не валит весь backfill — лог + продолжаем.
    # (WAF 403 пробросится из client и прервёт прогон — это ожидаемо,
    #  caller-task ловит и не ретраит, как в bulk_harvest.)

Прервать он не мог — ловил сам себя. Цикл шёл дальше по всем оставшимся кварталам, долбя уже блокирующий WAF.

Цена

Замер прода 20.08: limit=500 участков раскладывается на 174 квартала, каждый grid-walk делает 49 запросов.

Под баном один прогон выдал бы до ~8500 обращений в закрытую дверь вместо остановки на первом — ровно то поведение, что углубляет бан.

Правильный образец — в этом же файле

harvest_quarter (строка 190) починен предыдущей волной этого же эпика (#2464-A), с тем же доводом и прод-замером:

Прод-замер 13.08: 23 job'а, 50 WAF-блоков, 0 упавших — то есть бан ни разу не остановил сбор.

Здесь то же место пропустили. Правка приводит четвёртый сайт к трём соседним.

Чего НЕ утверждаю

Причастность к текущему бану НСПД (#2956). Задача backfill_parcel_geom_task в beat-расписании отсутствует — запускается вручную, проверено. Но запуск её сейчас, при живом 403, дал бы ровно описанный сценарий.

Тест

Проверяет поведение: вышла ли ошибка наружу и сколько кварталов успел тронуть прогон. Против origin/main:

WAF-блок    → вернулся GeomBackfillResult(quarters_scanned=3) вместо ошибки
rate-limit  → то же самое
обычный сбой пропускает ОДИН квартал  → контроль, зелёный с обеих сторон
здоровый прогон обходит все кварталы  → контроль, зелёный с обеих сторон

Первый контроль не для симметрии: ловит «починку», которая начала бы обрывать обход на любой ошибке — тогда один битый квартал стоил бы всей ночной докачки.

Прогоны

tests/services/cadastre + tests/services/scrapers   309 passed   rc=0
Пункт эпика #2464: `bulk_harvest.py:554`. ## Комментарий обещал то, чего код не делал ```python except Exception as e: # Один сбойный квартал не валит весь backfill — лог + продолжаем. # (WAF 403 пробросится из client и прервёт прогон — это ожидаемо, # caller-task ловит и не ретраит, как в bulk_harvest.) ``` Прервать он не мог — **ловил сам себя**. Цикл шёл дальше по всем оставшимся кварталам, долбя уже блокирующий WAF. ## Цена Замер прода 20.08: `limit=500` участков раскладывается на **174 квартала**, каждый grid-walk делает 49 запросов. Под баном один прогон выдал бы до **~8500 обращений** в закрытую дверь вместо остановки на первом — ровно то поведение, что углубляет бан. ## Правильный образец — в этом же файле `harvest_quarter` (строка 190) починен **предыдущей волной этого же эпика** (#2464-A), с тем же доводом и прод-замером: > Прод-замер 13.08: 23 job'а, 50 WAF-блоков, 0 упавших — то есть бан ни разу не остановил сбор. Здесь то же место пропустили. Правка приводит четвёртый сайт к трём соседним. ## Чего НЕ утверждаю Причастность к текущему бану НСПД (#2956). Задача `backfill_parcel_geom_task` **в beat-расписании отсутствует** — запускается вручную, проверено. Но запуск её сейчас, при живом 403, дал бы ровно описанный сценарий. ## Тест Проверяет поведение: вышла ли ошибка наружу и сколько кварталов успел тронуть прогон. Против `origin/main`: ``` WAF-блок → вернулся GeomBackfillResult(quarters_scanned=3) вместо ошибки rate-limit → то же самое обычный сбой пропускает ОДИН квартал → контроль, зелёный с обеих сторон здоровый прогон обходит все кварталы → контроль, зелёный с обеих сторон ``` Первый контроль не для симметрии: ловит «починку», которая начала бы обрывать обход на любой ошибке — тогда один битый квартал стоил бы всей ночной докачки. ## Прогоны ``` tests/services/cadastre + tests/services/scrapers 309 passed rc=0 ```
bot-backend added 1 commit 2026-08-20 10:08:45 +00:00
fix(ptica): WAF-блок прерывает backfill_parcel_geom, а не гонит его дальше по кварталам (#2464)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
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 9s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m2s
CI / backend-tests (pull_request) Successful in 17m20s
f0284b3539
Голый except Exception вокруг per-quarter grid-walk ловил и NspdBulkWafError, при
том что его собственный комментарий обещал обратное:

    # (WAF 403 пробросится из client и прервёт прогон — это ожидаемо,
    #  caller-task ловит и не ретраит, как в bulk_harvest.)

Прервать он не мог — ловил сам себя. Цикл шёл дальше по всем оставшимся кварталам,
долбя уже блокирующий WAF.

Цена. Замер прода 20.08: limit=500 участков раскладывается на 174 квартала, каждый
grid-walk делает 49 запросов. Под баном один прогон выдал бы до ~8500 обращений в
закрытую дверь вместо остановки на первом — ровно то поведение, что углубляет бан.

Соседний harvest_quarter в ЭТОМ ЖЕ файле починен предыдущей волной эпика (#2464-A)
с тем же доводом и прод-замером «23 job'а, 50 WAF-блоков, 0 упавших — то есть бан
ни разу не остановил сбор». Здесь то же место пропустили; правка приводит четвёртый
сайт к трём соседним.

Про причастность к текущему бану НСПД (#2956) не утверждаю: задача
backfill_parcel_geom_task в beat-расписании отсутствует, запускается вручную —
проверено. Но запуск её сейчас, при живом 403, дал бы ровно описанный сценарий.

Тест проверяет ПОВЕДЕНИЕ — вышла ли ошибка наружу и сколько кварталов успел
тронуть прогон. Против origin/main:

  WAF-блок      → вернулся GeomBackfillResult(quarters_scanned=3) вместо ошибки
  rate-limit    → то же самое
  обычный сбой пропускает ОДИН квартал  — контроль, зелёный с обеих сторон
  здоровый прогон обходит все кварталы  — контроль, зелёный с обеих сторон

Первый контроль не для симметрии: он ловит «починку», которая начала бы обрывать
обход на любой ошибке — тогда один битый квартал стоил бы всей ночной докачки.

Прогоны: tests/services/cadastre + tests/services/scrapers — 309 passed rc=0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit a4b989ca36 into main 2026-08-20 10:34:27 +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#2969
No description provided.