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:
co-authored by
Claude Opus 5
parent
8f1bf037cd
commit
e9aeaf9e62
@@ -4,6 +4,7 @@ from __future__ import annotations
|
||||
|
||||
import fnmatch
|
||||
import logging
|
||||
import time
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
|
||||
@@ -131,8 +132,16 @@ def run_group(proxmox, config, group, now=None, create=True, prune=True, guests=
|
||||
|
||||
snapshot_name = build_name(prefix, group.slug, now)
|
||||
template = group.description or config.globals.description
|
||||
pause = config.globals.pause_between
|
||||
first = True
|
||||
|
||||
for guest in selected:
|
||||
# Kurz durchatmen zwischen zwei Gaesten - entlastet den Storage-Lock,
|
||||
# wenn viele VMs auf demselben Storage liegen.
|
||||
if pause and not first and not config.globals.dry_run:
|
||||
time.sleep(pause)
|
||||
first = False
|
||||
|
||||
if group.skip_stopped and not guest.running:
|
||||
result.skipped.append("%s (gestoppt)" % guest.label)
|
||||
log.info("Gruppe '%s': %s uebersprungen (gestoppt)", group.name, guest.label)
|
||||
|
||||
Reference in New Issue
Block a user