Дробить плитку Overpass только при перегрузке, а не при отказе сети #3528

Merged
lekss361 merged 1 commit from fix/poi-no-split-on-transport-error into main 2026-09-15 07:33:57 +00:00
Owner

Что случилось сегодня

Запустил загрузку точек интереса по Москве из PR 3524. Первые четыре запроса прошли, дальше overpass-api.de начал отказывать в соединении именно нашему серверу. Проверил с хоста: отказ приходит на оба адреса, при этом Nominatim с того же сервера отвечает 200, а недельная синхронизация Екатеринбурга успешно отработала вчера. То есть блокировка свежая и по нашему адресу.

Хуже другое: адаптивное дробление плитки восприняло отказ соединения как «запрос слишком тяжёлый» и начало делить квадрат на четверти. За три минуты вышло 58 отказов на 4 успеха, то есть механизм защиты от потери данных превратился в генератор стука в блокирующий хост.

Почему это дефект, а не невезение

Дробление лечит ровно один класс отказа: сервер не успел посчитать. Это 504, 429, 503 и таймаут чтения, и тогда четверть действительно посчитается. Отказ на уровне транспорта про размер запроса не говорит ничего, а рекурсия глубиной три множит один отказ на 4, 16, 64.

Что сделано

Отказ транспорта больше не дробит плитку и не повторяет запрос, а пропускает её. Пять таких отказов подряд останавливают весь прогон отдельной ошибкой: стучаться в хост, который нас не принимает, бессмысленно и вредно. Успешная плитка обнуляет счётчик, поэтому одиночные сетевые икоты не копятся до аварийной остановки.

Дробление осталось ровно там, где было задумано, и проверяется тем же тестом, только подложный ответ теперь отдаёт настоящий 504 вместо абстрактной ошибки.

Проверено

pytest tests/test_poi_loader.py — 12 passed. Три новых случая: отказ транспорта делает ровно один запрос без четвертей, пять подряд роняют прогон, чередование отказов с успехами до аварии не доходит. ruff check и format чисты.

Загрузка Москвы будет перезапущена ночью, когда блокировка отпустит.

## Что случилось сегодня Запустил загрузку точек интереса по Москве из PR 3524. Первые четыре запроса прошли, дальше overpass-api.de начал отказывать в соединении именно нашему серверу. Проверил с хоста: отказ приходит на оба адреса, при этом Nominatim с того же сервера отвечает 200, а недельная синхронизация Екатеринбурга успешно отработала вчера. То есть блокировка свежая и по нашему адресу. Хуже другое: адаптивное дробление плитки восприняло отказ соединения как «запрос слишком тяжёлый» и начало делить квадрат на четверти. За три минуты вышло 58 отказов на 4 успеха, то есть механизм защиты от потери данных превратился в генератор стука в блокирующий хост. ## Почему это дефект, а не невезение Дробление лечит ровно один класс отказа: сервер не успел посчитать. Это 504, 429, 503 и таймаут чтения, и тогда четверть действительно посчитается. Отказ на уровне транспорта про размер запроса не говорит ничего, а рекурсия глубиной три множит один отказ на 4, 16, 64. ## Что сделано Отказ транспорта больше не дробит плитку и не повторяет запрос, а пропускает её. Пять таких отказов подряд останавливают весь прогон отдельной ошибкой: стучаться в хост, который нас не принимает, бессмысленно и вредно. Успешная плитка обнуляет счётчик, поэтому одиночные сетевые икоты не копятся до аварийной остановки. Дробление осталось ровно там, где было задумано, и проверяется тем же тестом, только подложный ответ теперь отдаёт настоящий 504 вместо абстрактной ошибки. ## Проверено `pytest tests/test_poi_loader.py` — 12 passed. Три новых случая: отказ транспорта делает ровно один запрос без четвертей, пять подряд роняют прогон, чередование отказов с успехами до аварии не доходит. ruff check и format чисты. Загрузка Москвы будет перезапущена ночью, когда блокировка отпустит.
lekss361 added 1 commit 2026-09-15 07:21:49 +00:00
fix(site-finder): дробить тайл Overpass только при перегрузке, не при отказе сети
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
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 / frontend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 13s
CI / openapi-codegen-check (pull_request) Successful in 2m34s
CI / backend-tests (pull_request) Successful in 7m3s
267e5382db
Дробление на четверти лечит «запрос слишком тяжёлый» (504/429/503, таймаут).
На отказе транспорта (connection refused / network unreachable) размер запроса
ни при чём, а рекурсия превращает один отказ в 4, 16, 64 повторных стука.
Живой случай 15.09.2026: загрузка Москвы поймала блокировку overpass-api.de по
IP сервера и за три минуты выдала 58 отказов на 4 успеха.

Транспортный отказ больше не дробит и не ретраит тайл, а пять подряд
останавливают весь прогон OverpassUnreachableError — незачем стучаться в
блокирующий хост. Успешный тайл обнуляет счётчик, одиночные икоты не копятся.
lekss361 merged commit dbf46228fb into main 2026-09-15 07:33:57 +00:00
lekss361 deleted branch fix/poi-no-split-on-transport-error 2026-09-15 07:33:57 +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#3528
No description provided.