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:
parent
66af669653
commit
6930e6f848
2 changed files with 17 additions and 5 deletions
|
|
@ -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)
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue