From 6930e6f8481ec3f480e546d6437309fb472dbf0e Mon Sep 17 00:00:00 2001 From: rene Date: Sat, 25 Apr 2026 22:54:12 +0200 Subject: [PATCH] OSM: Auto-Retry max 3x (30/60/90s), doppelte Tile-Fetches verhindert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Retry-Limit verhindert Endlos-Loop. Delay wächst (30s→60s→90s) damit mehr Tiles gecacht sein können. Kartenbewegung setzt Counter zurück. _fetching-Set im Backend verhindert parallele Doppel-Requests pro Tile. SW by-v407, APP_VER 387 --- backend/routes/osm.py | 9 +++++++++ backend/static/js/pages/map.js | 13 ++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/backend/routes/osm.py b/backend/routes/osm.py index c2c6735..d6e0df0 100644 --- a/backend/routes/osm.py +++ b/backend/routes/osm.py @@ -37,6 +37,9 @@ _OVERPASS_HEADERS = { # Referenzen auf laufende Hintergrund-Tasks — verhindert GC vor Abschluss _bg_tasks: set = set() +# Tiles die gerade gefetcht werden — verhindert Doppel-Requests +_fetching: set = set() + OSM_QUERIES = { 'waste_basket': '[out:json][timeout:20];node["amenity"="waste_basket"]({bbox});out;', 'dog_park': '[out:json][timeout:25];(way["leisure"="dog_park"]({bbox});node["leisure"="dog_park"]({bbox});way["leisure"="park"]["dog"="yes"]({bbox});node["leisure"="park"]["dog"="yes"]({bbox}););out center;', @@ -122,6 +125,10 @@ def _stale_tiles(poi_type, tiles): return stale async def _fetch_and_store_tile(poi_type, x, y): + fkey = f"{poi_type}_{CACHE_ZOOM}_{x}_{y}" + if fkey in _fetching: + return # bereits in Arbeit + _fetching.add(fkey) key = f"{CACHE_ZOOM}_{x}_{y}" s, w, n, e = _tile_to_bbox(x, y, CACHE_ZOOM) query = OSM_QUERIES[poi_type].format(bbox=f"{s},{w},{n},{e}") @@ -129,6 +136,7 @@ async def _fetch_and_store_tile(poi_type, x, y): elements = await _fetch_overpass(query) except Exception as exc: logger.warning(f"Overpass Fehler {poi_type} Tile {key}: {exc}") + _fetching.discard(fkey) return with db() as conn: for el in elements: @@ -159,6 +167,7 @@ async def _fetch_and_store_tile(poi_type, x, y): ON CONFLICT(type, tile_key) DO UPDATE SET cached_at=excluded.cached_at """, (poi_type, key)) logger.info(f"OSM Tile {key} ({poi_type}): {len(elements)} POIs gecacht.") + _fetching.discard(fkey) # ------------------------------------------------------------------ diff --git a/backend/static/js/pages/map.js b/backend/static/js/pages/map.js index 93c5243..8fb1188 100644 --- a/backend/static/js/pages/map.js +++ b/backend/static/js/pages/map.js @@ -123,6 +123,7 @@ window.Page_map = (() => { let _overpassActive = false; let _ringClosing = false; let _frankfurtTimer = null; + let _autoRetryCount = 0; // begrenzt Auto-Retry auf max 3x pro Kartenposition // ---------------------------------------------------------- // INIT @@ -341,7 +342,7 @@ window.Page_map = (() => { setTimeout(() => _map.invalidateSize(), 600); window.addEventListener('resize', () => _map.invalidateSize()); - _map.on('moveend zoomend', () => { _updateZoomDisplay(); _scheduleOsmLoad(); }); + _map.on('moveend zoomend', () => { _autoRetryCount = 0; _updateZoomDisplay(); _scheduleOsmLoad(); }); setTimeout(() => { _updateZoomDisplay(); _scheduleOsmLoad(); }, 800); // Fadenkreuz-Animation beim Kartenverschieben @@ -703,10 +704,12 @@ window.Page_map = (() => { _setOsmStatus('Layer deaktiviert — Liste antippen', 100); } - // Wenn 0 OSM-Marker: Hintergrund-Fetch läuft noch — automatisch nochmal scannen - if (totalLoaded === 0 && zoom >= 14) { - _setOsmStatus('Lade…'); - setTimeout(() => { if (!_overpassActive) _scheduleOsmLoad(); }, 20000); + // Wenn 0 OSM-Marker: Hintergrund-Fetch läuft noch — max 3× automatisch nachfragen + if (totalLoaded === 0 && zoom >= 14 && _autoRetryCount < 3) { + _autoRetryCount++; + const delay = _autoRetryCount * 30000; // 30s, 60s, 90s + _setOsmStatus(`Neue Umgebung – Daten werden geladen…`); + setTimeout(() => { if (!_overpassActive) _scheduleOsmLoad(); }, delay); } }