Garder localement les sources des dalles sur une carte alimentée par l'amont
Avec LIDAR_SOURCE_URL (Pi), la maintenance rapatrie et conserve les sources de chaque dalle dès qu'elle apparaît, sans attendre de visite : les niveaux rendus à la volée restent disponibles quand le conteneur de rendu est éteint. Seuls les paliers utiles sont pris (vignettes, quadrants 500 m ; la dalle entière, doublon de ses quadrants, ne l'est pas) ; une source manquée pendant que l'amont était éteint est reprise au scan suivant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@ -973,3 +973,37 @@ def test_background_scan_only_queues_stored_levels(tmp_path, monkeypatch):
|
||||
zs = {z for (_l, z, _x, _y) in mapserve._bg["queue"]}
|
||||
assert zs and all(tiles.zoom_cached(z, 2) for z in zs)
|
||||
assert zs <= {5, 7, 9, 11, 13, 15}
|
||||
|
||||
|
||||
def test_remote_fed_map_keeps_sources_locally(tmp_path, monkeypatch):
|
||||
"""Carte alimentée par l'amont : les sources nécessaires sont rapatriées
|
||||
et gardées sans attendre de visite ; une source manquée (amont éteint)
|
||||
est reprise au scan suivant ; la dalle entière (doublon) n'est pas prise."""
|
||||
import lidar_pipeline.mapserve as mapserve
|
||||
from lidar_pipeline import tiles
|
||||
S = tiles._Source
|
||||
thumb = S(tmp_path / "t.webp", (0, 0, 1000, 1000), 3.9, url="http://amont/t")
|
||||
quads = [S(tmp_path / f"q{i}.avif", (0, 0, 500, 500), 0.2, url=f"http://amont/q{i}") for i in range(4)]
|
||||
full = S(tmp_path / "d.avif", (0, 0, 1000, 1000), 0.2, url="http://amont/d")
|
||||
assert tiles.sources_to_keep([[thumb], quads, [full]]) == [thumb] + quads
|
||||
monkeypatch.setattr(tiles, "REMOTE_SOURCE_URL", "http://amont")
|
||||
monkeypatch.setattr(mapserve, "OUTPUT_DIR", tmp_path)
|
||||
monkeypatch.setattr(tiles, "source_index", lambda *a, **k: {"relief_oriente": {(1, 2): [[thumb], quads, [full]]}})
|
||||
for key, val in (("queue", __import__("collections").deque()), ("queued", set()),
|
||||
("snapshot", None), ("prefetch", __import__("collections").deque())):
|
||||
monkeypatch.setitem(mapserve._bg, key, val)
|
||||
online = {"up": False}
|
||||
def fake_fetch(url, dest):
|
||||
if not online["up"]:
|
||||
return False
|
||||
dest.write_bytes(b"x"); return True
|
||||
monkeypatch.setattr(tiles, "_fetch_source", fake_fetch)
|
||||
mapserve.background_scan(tmp_path)
|
||||
while mapserve._bg["prefetch"]:
|
||||
mapserve._bg_process_one()
|
||||
assert not any(s_.path.exists() for s_ in [thumb] + quads) # amont éteint
|
||||
online["up"] = True
|
||||
mapserve.background_scan(tmp_path) # dalle inchangée : reprise quand même
|
||||
while mapserve._bg["prefetch"]:
|
||||
mapserve._bg_process_one()
|
||||
assert all(s_.path.exists() for s_ in [thumb] + quads) and not full.path.exists()
|
||||
|
||||
Reference in New Issue
Block a user