diff --git a/docker/api/mounts.py b/docker/api/mounts.py index 8b7a4fa..c9ef838 100644 --- a/docker/api/mounts.py +++ b/docker/api/mounts.py @@ -43,13 +43,17 @@ def ist_erreichbar(name: str) -> bool: """Kann auf das Ziel WIRKLICH zugegriffen werden? Ein toter CIFS-Mount (Host weg, stale) ist zwar 'gemountet', aber jeder - Zugriff scheitert mit „Host is down" (Befund 24.07.). CIFS läuft mit - `soft`, d. h. der Zugriff bricht schnell ab statt zu hängen. + Zugriff scheitert. Der Zugriff wird HART auf 3 s begrenzt (`timeout 3 ls`) + — ein direktes os.listdir blockierte sonst bis zum CIFS-Timeout (~10 s, + Befund 24.07.: die Speicherziele-Seite lud dadurch träge). """ + ziel = _mountpoint(name) try: - os.listdir(_mountpoint(name)) - return True - except OSError: + ergebnis = subprocess.run( + ["timeout", "3", "ls", ziel], capture_output=True, timeout=5 + ) + return ergebnis.returncode == 0 + except (OSError, subprocess.TimeoutExpired): return False @@ -141,9 +145,17 @@ def mounten(name: str, typ: str, quelle: str, optionen: str = "", Mount-Fehlern. """ ziel = _mountpoint(name) - os.makedirs(ziel, exist_ok=True) - if os.path.ismount(ziel): - return schreibtest(ziel) + # exist_ok fängt „Ordner da" NICHT, wenn ein toter Mount os.path.isdir + # täuschen lässt (FileExistsError, Befund 24.07.) — deshalb tolerant. + try: + os.makedirs(ziel, exist_ok=True) + except FileExistsError: + pass + try: + if os.path.ismount(ziel): + return schreibtest(ziel) + except OSError: + pass # toter Mount → als „nicht gemountet" behandeln und neu mounten creds_datei = None try: