OSM: Auto-Retry max 3x (30/60/90s), doppelte Tile-Fetches verhindert

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
This commit is contained in:
rene 2026-04-25 22:54:12 +02:00
parent 66af669653
commit 6930e6f848
2 changed files with 17 additions and 5 deletions

View file

@ -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)
# ------------------------------------------------------------------

View file

@ -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);
}
}