diff --git a/lidar_pipeline/index.py b/lidar_pipeline/index.py index bc0b347..2559a64 100644 --- a/lidar_pipeline/index.py +++ b/lidar_pipeline/index.py @@ -823,12 +823,24 @@ def _build_subtiles(tile, offered_viz_keys, output_dir, sub_dir_name): if not heavy_fresh: logger.info(f" Sous-tuiles recalculées : {tile['dir_name']}/{viz_key} " f"({len(stems)} découpages)") - try: - img = PILImage.open(str(src)) - img.load() - except Exception as e: - logger.debug(f"Sous-tuilage {viz_key} impossible ({src.name}): {e}") - _fallback_full_dalle(entries, viz_key, info) + img = None + for attempt in range(2): + try: + img = PILImage.open(str(src)) + img.load() + break + except Exception as e: + # Rebuild incrémental pendant un run : la dalle source + # peut être en cours d'écriture par un worker voisin + # (lecture partielle). Une tentative après une courte + # pause suffit presque toujours. + if attempt == 0: + time.sleep(2.0) + continue + logger.warning(f"Sous-tuilage {viz_key} impossible après " + f"nouvelle tentative ({src.name}) : {e}") + _fallback_full_dalle(entries, viz_key, info) + if img is None: continue if img.mode not in ('RGB', 'L'): img = img.convert('RGB')