[virt-tools-list] [virt-manager RFC PATCH 1/2] details: snapshots: Drop saved state on restore

Michael Weiser michael.weiser at gmx.de
Thu Dec 19 21:52:33 UTC 2019


Refuse to restore a non-running state from snapshot while there is saved
memory state in order to avoid filesystem corruption. Present a message
to the user to that effect and let them choose to either abort the
operation or drop the saved state before restoring the snapshot.

Signed-off-by: Michael Weiser <michael.weiser at gmx.de>
Suggested-by: Cole Robinson <crobinso at redhat.com>
---
 virtManager/details/snapshots.py | 14 ++++++++++++++
 virtManager/object/domain.py     |  6 ++++++
 2 files changed, 20 insertions(+)

diff --git a/virtManager/details/snapshots.py b/virtManager/details/snapshots.py
index 65d014a5..bc5b915a 100644
--- a/virtManager/details/snapshots.py
+++ b/virtManager/details/snapshots.py
@@ -656,6 +656,20 @@ class vmmSnapshotPage(vmmGObjectUI):
         if not result:
             return
 
+        if self.vm.has_managed_save() and not snap.has_run_state():
+            result = self.err.ok_cancel(
+                _("Saved state will be removed to avoid filesystem corruption"),
+                _("Snapshot '%s' contains only disk and no memory state. "
+                  "Restoring the snapshot would leave the existing saved state "
+                  "in place, effectively switching a disk underneath a running "
+                  "system. Running the domain afterwards would likely result in "
+                  "extensive filesystem corruption. Therefore the saved state "
+                  "will be removed before restoring the snapshot."
+                  ) % snap.get_name())
+            if not result:
+                return
+            self.vm.remove_saved_image()
+
         log.debug("Running snapshot '%s'", snap.get_name())
         vmmAsyncJob.simple_async(self.vm.revert_to_snapshot,
                             [snap], self,
diff --git a/virtManager/object/domain.py b/virtManager/object/domain.py
index bad7108e..7fa85d32 100644
--- a/virtManager/object/domain.py
+++ b/virtManager/object/domain.py
@@ -161,6 +161,12 @@ class vmmDomainSnapshot(vmmLibvirtObject):
         Captured state is a running domain.
         """
         return self._state_str_to_int() in [libvirt.VIR_DOMAIN_RUNNING]
+    def has_run_state(self):
+        """
+        Captured state contains run state in addition to disk state.
+        """
+        return self._state_str_to_int() in [libvirt.VIR_DOMAIN_RUNNING,
+                                            libvirt.VIR_DOMAIN_PAUSED]
 
     def is_current(self):
         return self._backend.isCurrent()
-- 
2.24.1





More information about the virt-tools-list mailing list