Snapshot-Laeufe gegen cfs-Sperren des Storages absichern

Auf einem echten Host schlugen Snapshots reihenweise mit
"cfs-lock 'storage-NAME' error: got lock request timeout" fehl.

Ursache: 'pvesh create .../snapshot' lief mit dem allgemeinen
Kommando-Zeitlimit von 60s. Genau so lange wartet Proxmox aber auf den
Storage-Lock. Lief der Aufruf in unser Zeitlimit, ging es mit der naechsten
VM weiter, waehrend der Task noch lief - und die naechste VM scheiterte
dann an derselben Sperre. Eine VM konnte so einen ganzen Lauf umwerfen.

* Snapshot-Aktionen laufen jetzt mit dem langen task_timeout statt mit dem
  kurzen Zeitlimit fuer Lesezugriffe.
* Ohne UPID in der Antwort wird ersatzweise gewartet, bis der Gast nicht
  mehr gesperrt ist, statt sofort weiterzumachen.
* Sperr-Fehler gelten als voruebergehend und werden 'retries'-mal mit
  'retry_delay' Abstand wiederholt; echte Fehler wie "storage does not
  support snapshots" nicht.
* Neu: 'pause_between' fuer eine Pause zwischen zwei Gaesten.

Ausserdem: Kommentare hinter einem Wert ("retries = 2  # ...") wurden nicht
abgeschnitten und machten die Konfiguration ungueltig - das eigene
Beispiel war davon betroffen. 'description' bleibt bewusst unangetastet,
damit ein '#' in der Beschreibung erhalten bleibt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-07-31 01:54:59 +02:00
co-authored by Claude Opus 5
parent 8f1bf037cd
commit e9aeaf9e62
8 changed files with 197 additions and 17 deletions
+2 -4
View File
@@ -130,8 +130,7 @@ def cmd_run(args):
print("Zurzeit ist keine Gruppe faellig. (--force erzwingt den Lauf)")
return 0
proxmox = Proxmox(dry_run=config.globals.dry_run,
task_timeout=config.globals.task_timeout)
proxmox = Proxmox.from_config(config)
guests = proxmox.inventory()
failed = False
@@ -162,8 +161,7 @@ def cmd_prune(args):
return 2
groups.append(group)
proxmox = Proxmox(dry_run=config.globals.dry_run,
task_timeout=config.globals.task_timeout)
proxmox = Proxmox.from_config(config)
guests = proxmox.inventory()
failed = False
with SingleInstanceLock(config.globals.lock_file, wait=600,