Storage-Unterschiede beim Abkoppeln benennen statt pauschal zu melden
Die Abhaengigkeit vom Quell-Snapshot ist eine Ceph-Eigenheit. Bisher meldete flatten alles andere pauschal als "kein Ceph-Datentraeger" - das klingt nach Einschraenkung, ist bei LVM-thin aber das Gegenteil. Nachgemessen auf local-lvm: ein Thin-Snapshot teilt sich die Bloecke im Pool (256 MB Nutzdaten liegen dort nur einmal), ist aber trotzdem eigenstaendig - Quell-Snapshot und Original liessen sich loeschen, waehrend der Klon existiert, und seine Pruefsumme blieb unveraendert. Dort gibt es also weder geschuetzte Snapshots noch etwas zu flatten. lvmthin nicht noetig, Klon ist von sich aus unabhaengig zfspool nicht moeglich, ginge nur ueber zfs send | zfs recv rbd noetig fuer den Dauerbetrieb lvm dick PVE kann dort gar keine Snapshots Der Hinweis in der Zusammenfassung richtet sich jetzt ebenfalls nach dem Storage-Typ, statt immer zum Flatten zu raten. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
09dcd4c572
commit
2c85011a08
+33
-4
@@ -256,6 +256,26 @@ def linked_volumes(proxmox, instance):
|
||||
return linked
|
||||
|
||||
|
||||
def flatten_hint(proxmox, volid):
|
||||
"""Warum ein Datentraeger nicht abgekoppelt wird - je nach Storage.
|
||||
|
||||
Nur Ceph kennt das Problem ueberhaupt: dort haelt ein Klon seinen
|
||||
Quell-Snapshot fest. Andere Storage-Typen loesen das anders oder gar nicht.
|
||||
"""
|
||||
storage = volid.split(":", 1)[0] if ":" in volid else ""
|
||||
try:
|
||||
kind = (proxmox._json(["get", "/storage/%s" % storage]) or {}).get("type", "")
|
||||
except ProxmoxError:
|
||||
kind = ""
|
||||
if kind == "lvmthin":
|
||||
return ("nicht noetig - Thin-Snapshots sind von sich aus unabhaengig; "
|
||||
"Quell-Snapshot und Original lassen sich jederzeit loeschen")
|
||||
if kind == "zfspool":
|
||||
return ("nicht moeglich - ein ZFS-Klon haengt am Snapshot. Loesen ginge "
|
||||
"nur ueber 'zfs send | zfs recv' in einen neuen Datentraeger")
|
||||
return "kein Ceph-Datentraeger"
|
||||
|
||||
|
||||
def flatten_cost(proxmox, instance):
|
||||
"""Wieviele Bytes ein flatten kopieren muesste.
|
||||
|
||||
@@ -785,10 +805,19 @@ def plan(proxmox, guest, snapname, spec):
|
||||
"vergroessern oder verkleinern - entweder --memory "
|
||||
"weglassen oder --no-resume verwenden.")
|
||||
if spec.mode == "recovery":
|
||||
result.notes.append(
|
||||
"Die Datentraeger sind Linked Clones - sie haengen am Quell-Snapshot, "
|
||||
"der dadurch unloeschbar wird. Soll die Maschine dauerhaft laufen, "
|
||||
"spaeter mit 'pvesnap-recovery flatten %d' loesen." % result.newid)
|
||||
kinds = {_storage_info(proxmox, volid.split(":", 1)[0]).get("type")
|
||||
for _key, volid, _size in result.disks}
|
||||
if "rbd" in kinds:
|
||||
result.notes.append(
|
||||
"Die Datentraeger sind Linked Clones - auf Ceph haelt ein Klon "
|
||||
"seinen Quell-Snapshot fest, der dadurch unloeschbar wird. Soll "
|
||||
"die Maschine dauerhaft laufen, spaeter mit "
|
||||
"'pvesnap-recovery flatten %d' loesen." % result.newid)
|
||||
elif kinds <= {"lvmthin"}:
|
||||
result.notes.append(
|
||||
"Die Datentraeger sind Thin-Snapshots und damit von sich aus "
|
||||
"unabhaengig - Quell-Snapshot und Original lassen sich jederzeit "
|
||||
"loeschen. Ein Abkoppeln ist nicht noetig.")
|
||||
if result.resume:
|
||||
result.notes.append("Der Arbeitsspeicher (%s) wird kopiert; die Maschine "
|
||||
"laeuft danach genau dort weiter, wo sie beim Snapshot "
|
||||
|
||||
@@ -27,7 +27,8 @@ from .curses_util import (C_DIM, C_FOOTER, C_HEADER, C_MARK, C_OK, C_SEL, C_WARN
|
||||
keybar, message, prompt, put, read_key)
|
||||
from .proxmox import Proxmox, ProxmoxError, pvesh_available
|
||||
from .recovery import (EXCHANGE_GUEST_PATH, MKFS, RecoveryError, Spec, create,
|
||||
destroy, find_orphans, flatten, flatten_cost, human_bytes,
|
||||
destroy, find_orphans, flatten, flatten_cost, flatten_hint,
|
||||
human_bytes,
|
||||
linked_volumes, list_instances, plan, pull, release,
|
||||
remove_orphans, start)
|
||||
from .snapfs import list_snapshots
|
||||
@@ -565,7 +566,8 @@ def _flatten(stdscr, proxmox, instance, linked):
|
||||
+ _plain(progress.lines), "Fehlgeschlagen")
|
||||
return
|
||||
lines = ["%d Datentraeger geloest." % len(done), ""]
|
||||
lines += ["nicht behandelt (kein Ceph): %s" % volid for volid in other]
|
||||
for volid in other:
|
||||
lines += _wrap("%s: %s" % (volid, flatten_hint(proxmox, volid)), 74)
|
||||
if not linked_volumes(proxmox, instance):
|
||||
lines += ["", "%s ist jetzt eigenstaendig. Die Snapshots des Originals "
|
||||
"lassen sich wieder loeschen." % instance.label]
|
||||
@@ -889,7 +891,7 @@ def cmd_flatten(proxmox, args):
|
||||
for volid in already:
|
||||
print(" war schon eigenstaendig: %s" % volid)
|
||||
for volid in other:
|
||||
print(" nicht behandelt (kein Ceph-Datentraeger): %s" % volid)
|
||||
print(" %s: %s" % (volid, flatten_hint(proxmox, volid)))
|
||||
if not linked_volumes(proxmox, instance):
|
||||
print("\n%s ist jetzt eigenstaendig. Die Snapshots des Originals lassen "
|
||||
"sich wieder loeschen." % instance.label)
|
||||
|
||||
Reference in New Issue
Block a user