[libvirt] [PATCHv2 07/20] snapshot: qemu: Add async job type for snapshots

Peter Krempa pkrempa at redhat.com
Thu Nov 1 16:22:13 UTC 2012


The new external system checkpoints will require an async job while the
snapshot is taken. This patch adds QEMU_ASYNC_JOB_SNAPSHOT to track this
job type.
---
 src/qemu/qemu_domain.c  |  3 +++
 src/qemu/qemu_domain.h  |  1 +
 src/qemu/qemu_process.c | 19 +++++++++++++++++++
 3 files changed, 23 insertions(+)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d01e366..a5592b9 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -65,6 +65,7 @@ VIR_ENUM_IMPL(qemuDomainAsyncJob, QEMU_ASYNC_JOB_LAST,
               "migration in",
               "save",
               "dump",
+              "snapshot",
 );


@@ -79,6 +80,7 @@ qemuDomainAsyncJobPhaseToString(enum qemuDomainAsyncJob job,

     case QEMU_ASYNC_JOB_SAVE:
     case QEMU_ASYNC_JOB_DUMP:
+    case QEMU_ASYNC_JOB_SNAPSHOT:
     case QEMU_ASYNC_JOB_NONE:
     case QEMU_ASYNC_JOB_LAST:
         ; /* fall through */
@@ -101,6 +103,7 @@ qemuDomainAsyncJobPhaseFromString(enum qemuDomainAsyncJob job,

     case QEMU_ASYNC_JOB_SAVE:
     case QEMU_ASYNC_JOB_DUMP:
+    case QEMU_ASYNC_JOB_SNAPSHOT:
     case QEMU_ASYNC_JOB_NONE:
     case QEMU_ASYNC_JOB_LAST:
         ; /* fall through */
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 8a66f14..9c2f67c 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -92,6 +92,7 @@ enum qemuDomainAsyncJob {
     QEMU_ASYNC_JOB_MIGRATION_IN,
     QEMU_ASYNC_JOB_SAVE,
     QEMU_ASYNC_JOB_DUMP,
+    QEMU_ASYNC_JOB_SNAPSHOT,

     QEMU_ASYNC_JOB_LAST
 };
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 3ac5282..67a7157 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3046,6 +3046,25 @@ qemuProcessRecoverJob(struct qemud_driver *driver,
         }
         break;

+    case QEMU_ASYNC_JOB_SNAPSHOT:
+        qemuDomainObjEnterMonitor(driver, vm);
+        ignore_value(qemuMonitorMigrateCancel(priv->mon));
+        qemuDomainObjExitMonitor(driver, vm);
+         /* resume the domain but only if it was paused as a result of
+          * creating the snapshot. */
+        if (state == VIR_DOMAIN_PAUSED &&
+            ((job->asyncJob == QEMU_ASYNC_JOB_SNAPSHOT &&
+              reason == VIR_DOMAIN_PAUSED_MIGRATION) ||
+             reason == VIR_DOMAIN_PAUSED_UNKNOWN)) {
+            if (qemuProcessStartCPUs(driver, vm, conn,
+                                     VIR_DOMAIN_RUNNING_UNPAUSED,
+                                     QEMU_ASYNC_JOB_NONE) < 0) {
+                VIR_WARN("Could not resume domain %s after snapshot",
+                         vm->def->name);
+            }
+        }
+        break;
+
     case QEMU_ASYNC_JOB_NONE:
     case QEMU_ASYNC_JOB_LAST:
         break;
-- 
1.7.12.4




More information about the libvir-list mailing list