[PATCH 3/3] Snapshot: restore domain description from snapshot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Restore the domain description from the snapshot information.
TODOs:
- Only restart the KVM process when the snapshot is incompatible with
  "loadvm". This would have the benefir of being able to switch saved
  states very fast and also doesn't disconnect any VNC viewer.

Signed-off-by: Philipp Hahn <hahn@xxxxxxxxxxxxx>
---
 src/qemu/qemu_driver.c |   39 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 38 insertions(+), 1 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 5041d32..5610961 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6282,6 +6282,7 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
 {
     struct qemud_driver *driver = domain->conn->privateData;
     virDomainObjPtr vm = NULL;
+    virDomainDefPtr newDef = NULL;
     virDomainSnapshotObjPtr snap = NULL;
     virDomainSnapshotPtr snapshot = NULL;
     char uuidstr[VIR_UUID_STRING_BUFLEN];
@@ -6311,6 +6312,18 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
     if (!(def = virDomainSnapshotDefParseString(xmlDesc, 1, qemu_driver->caps)))
         goto cleanup;
 
+    /* create copy */
+    if (!def->dom) {
+        char *xml = NULL;
+        if (!(xml = virDomainDefFormat(vm->def, VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_SECURE)))
+            goto cleanup;
+        newDef = virDomainDefParseString(driver->caps, xml, VIR_DOMAIN_XML_INACTIVE);
+        VIR_FREE(xml);
+        if (!newDef)
+            goto cleanup;
+        def->dom = newDef;
+    }
+
     if (!(snap = virDomainSnapshotAssignDef(&vm->snapshots, def)))
         goto cleanup;
 
@@ -6561,6 +6574,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
     virDomainEventPtr event = NULL;
     qemuDomainObjPrivatePtr priv;
     int rc;
+    virDomainDefPtr newDef = NULL;
 
     virCheckFlags(0, -1);
 
@@ -6586,10 +6600,23 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
     if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0)
         goto cleanup;
 
+    /* create copy */
+    if (snap->def->dom) {
+        char *xml = NULL;
+        /* TODO:Compare old definition to new definition to decide, if KVM must be restarted or existing KVM can be reused. */
+        if (!(xml = virDomainDefFormat(snap->def->dom, VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_SECURE)))
+            goto cleanup;
+        newDef = virDomainDefParseString(driver->caps, xml, VIR_DOMAIN_XML_INACTIVE);
+        VIR_FREE(xml);
+        if (!newDef)
+            goto cleanup;
+		virDomainObjAssignDef(vm, newDef, false);
+    }
+
     if (snap->def->state == VIR_DOMAIN_RUNNING
         || snap->def->state == VIR_DOMAIN_PAUSED) {
 
-        if (virDomainObjIsActive(vm)) {
+        if (virDomainObjIsActive(vm) && !newDef) {
             priv = vm->privateData;
             qemuDomainObjEnterMonitorWithDriver(driver, vm);
             rc = qemuMonitorLoadSnapshot(priv->mon, snap->def->name);
@@ -6598,6 +6625,16 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
                 goto endjob;
         }
         else {
+            if (virDomainObjIsActive(vm)) {
+                //qemudShutdownVMDaemon(driver, vm, 0); // <= 0.12.4
+                qemuProcessStop(driver, vm, 0); // >= 14
+                if (!vm->persistent) {
+                    if (qemuDomainObjEndJob(vm) > 0)
+                        virDomainRemoveInactive(&driver->domains, vm);
+                    vm = NULL;
+                    goto cleanup;
+                }
+            }
             if (qemuDomainSnapshotSetCurrentActive(vm, driver->snapshotDir) < 0)
                 goto endjob;
 
-- 
1.7.1

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]