From 47d07d616825da5bdb96af439a0273823cda5492 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Fri, 24 Jul 2026 18:23:12 +0200 Subject: [PATCH] fix(mounts): Reparatur crashte an makedirs + reachable-Check auf 3s begrenzt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - mounten(): FileExistsError von os.makedirs abgefangen und ismount OSError toleriert — ein toter Mount taeuschte isdir, die Reparatur brach ab. - ist_erreichbar(): 'timeout 3 ls' statt os.listdir — der direkte Zugriff blockierte sonst ~10s bis zum CIFS-Timeout (traege Speicherziele-Seite). Co-Authored-By: Claude Fable 5 --- docker/api/mounts.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) 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: