fix(ptica): WAF-блок прерывает backfill_parcel_geom, а не гонит его дальше по кварталам (#2464) #2969
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2969
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2464-backfill-waf-abort"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Пункт эпика #2464:
bulk_harvest.py:554.Комментарий обещал то, чего код не делал
Прервать он не мог — ловил сам себя. Цикл шёл дальше по всем оставшимся кварталам, долбя уже блокирующий WAF.
Цена
Замер прода 20.08:
limit=500участков раскладывается на 174 квартала, каждый grid-walk делает 49 запросов.Под баном один прогон выдал бы до ~8500 обращений в закрытую дверь вместо остановки на первом — ровно то поведение, что углубляет бан.
Правильный образец — в этом же файле
harvest_quarter(строка 190) починен предыдущей волной этого же эпика (#2464-A), с тем же доводом и прод-замером:Здесь то же место пропустили. Правка приводит четвёртый сайт к трём соседним.
Чего НЕ утверждаю
Причастность к текущему бану НСПД (#2956). Задача
backfill_parcel_geom_taskв beat-расписании отсутствует — запускается вручную, проверено. Но запуск её сейчас, при живом 403, дал бы ровно описанный сценарий.Тест
Проверяет поведение: вышла ли ошибка наружу и сколько кварталов успел тронуть прогон. Против
origin/main:Первый контроль не для симметрии: ловит «починку», которая начала бы обрывать обход на любой ошибке — тогда один битый квартал стоил бы всей ночной докачки.
Прогоны
Голый 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>