fix(mounts): Reparatur crashte an makedirs + reachable-Check auf 3s begrenzt
Ampel / ampel (push) Successful in 28s

- 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 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-24 18:23:12 +02:00
parent 4ba02047db
commit 47d07d6168
+20 -8
View File
@@ -43,13 +43,17 @@ def ist_erreichbar(name: str) -> bool:
"""Kann auf das Ziel WIRKLICH zugegriffen werden? """Kann auf das Ziel WIRKLICH zugegriffen werden?
Ein toter CIFS-Mount (Host weg, stale) ist zwar 'gemountet', aber jeder 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 Zugriff scheitert. Der Zugriff wird HART auf 3 s begrenzt (`timeout 3 ls`)
`soft`, d. h. der Zugriff bricht schnell ab statt zu hängen. — 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: try:
os.listdir(_mountpoint(name)) ergebnis = subprocess.run(
return True ["timeout", "3", "ls", ziel], capture_output=True, timeout=5
except OSError: )
return ergebnis.returncode == 0
except (OSError, subprocess.TimeoutExpired):
return False return False
@@ -141,9 +145,17 @@ def mounten(name: str, typ: str, quelle: str, optionen: str = "",
Mount-Fehlern. Mount-Fehlern.
""" """
ziel = _mountpoint(name) ziel = _mountpoint(name)
os.makedirs(ziel, exist_ok=True) # exist_ok fängt „Ordner da" NICHT, wenn ein toter Mount os.path.isdir
if os.path.ismount(ziel): # täuschen lässt (FileExistsError, Befund 24.07.) — deshalb tolerant.
return schreibtest(ziel) 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 creds_datei = None
try: try: