Fix: Overpass-Fallback auf kumi.systems — overpass-api.de gibt 406 zurück
overpass-api.de und lz4.overpass-api.de blockieren die Server-IP mit 406. OVERPASS_URLS-Liste mit Fallback: kumi → lz4 → overpass-api.de. _fetch_overpass probiert jede Instanz, springt bei 4xx-Fehler zur nächsten.
This commit is contained in:
parent
8d3a620275
commit
91389b9a3f
1 changed files with 24 additions and 13 deletions
|
|
@ -16,9 +16,13 @@ from auth import get_current_user, get_current_user_optional as get_optional_use
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
CACHE_ZOOM = 12
|
CACHE_ZOOM = 12
|
||||||
CACHE_DAYS = 14
|
CACHE_DAYS = 14
|
||||||
OVERPASS_URL = 'https://overpass-api.de/api/interpreter'
|
OVERPASS_URLS = [
|
||||||
|
'https://overpass.kumi.systems/api/interpreter',
|
||||||
|
'https://lz4.overpass-api.de/api/interpreter',
|
||||||
|
'https://overpass-api.de/api/interpreter',
|
||||||
|
]
|
||||||
|
|
||||||
# Globales Limit: max 2 gleichzeitige Overpass-Anfragen (Prewarm + User geteilt)
|
# Globales Limit: max 2 gleichzeitige Overpass-Anfragen (Prewarm + User geteilt)
|
||||||
_overpass_sem = asyncio.Semaphore(2)
|
_overpass_sem = asyncio.Semaphore(2)
|
||||||
|
|
@ -64,17 +68,24 @@ def _covering_tiles(south, west, north, east, zoom):
|
||||||
# Overpass-Fetch + Cache
|
# Overpass-Fetch + Cache
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
async def _fetch_overpass(query):
|
async def _fetch_overpass(query):
|
||||||
for attempt in range(3):
|
for url in OVERPASS_URLS:
|
||||||
async with _overpass_sem:
|
for attempt in range(2):
|
||||||
async with httpx.AsyncClient(timeout=40) as client:
|
try:
|
||||||
r = await client.post(OVERPASS_URL, data={'data': query})
|
async with _overpass_sem:
|
||||||
if r.status_code != 429:
|
async with httpx.AsyncClient(timeout=40) as client:
|
||||||
r.raise_for_status()
|
r = await client.post(url, data={'data': query})
|
||||||
|
if r.status_code == 200:
|
||||||
return r.json().get('elements', [])
|
return r.json().get('elements', [])
|
||||||
logger.warning(f"Overpass 429 (Versuch {attempt + 1}/3)")
|
if r.status_code == 429:
|
||||||
# Semaphore freigeben, dann warten
|
logger.warning(f"Overpass 429 {url} (Versuch {attempt + 1}/2)")
|
||||||
await asyncio.sleep(45 * (attempt + 1))
|
await asyncio.sleep(30 * (attempt + 1))
|
||||||
raise Exception("Overpass 429 nach 3 Versuchen")
|
continue # gleiche URL nochmal
|
||||||
|
logger.warning(f"Overpass {r.status_code} {url} — nächste Instanz")
|
||||||
|
break # nächste URL
|
||||||
|
except Exception as exc:
|
||||||
|
logger.warning(f"Overpass Verbindungsfehler {url}: {exc}")
|
||||||
|
break # nächste URL
|
||||||
|
raise Exception("Alle Overpass-Instanzen fehlgeschlagen")
|
||||||
|
|
||||||
def _stale_tiles(poi_type, tiles):
|
def _stale_tiles(poi_type, tiles):
|
||||||
stale = []
|
stale = []
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue