[libvirt] [PATCH v2 10/15] virsh: Add --postcopy-after-precopy option to migrate

Jiri Denemark jdenemar at redhat.com
Thu Jan 21 10:20:55 UTC 2016


From: Cristian Klein <cristiklein at gmail.com>

Signed-off-by: Cristian Klein <cristiklein at gmail.com>
Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---

Notes:
    Version 2:
    - implement --postcopy-after-precopy entirely in virsh

 tools/virsh-domain.c | 35 +++++++++++++++++++++++++++++++++++
 tools/virsh.pod      |  9 ++++++---
 2 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 96125bb..75a9f38 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -9627,6 +9627,10 @@ static const vshCmdOptDef opts_migrate[] = {
      .type = VSH_OT_BOOL,
      .help = N_("enable post-copy migration; switch to it using migrate-postcopy command")
     },
+    {.name = "postcopy-after-precopy",
+     .type = VSH_OT_BOOL,
+     .help = N_("automatically switch to post-copy migration after one pass of pre-copy")
+    },
     {.name = "migrateuri",
      .type = VSH_OT_STRING,
      .help = N_("migration URI, usually can be omitted")
@@ -9863,6 +9867,23 @@ virshMigrateTimeout(vshControl *ctl,
     }
 }
 
+static void
+virshMigrateIteration(virConnectPtr conn ATTRIBUTE_UNUSED,
+                      virDomainPtr dom,
+                      int iteration,
+                      void *opaque)
+{
+    vshControl *ctl = opaque;
+
+    if (iteration == 2) {
+        vshDebug(ctl, VSH_ERR_DEBUG,
+                 "iteration %d finished; switching to post-copy\n",
+                 iteration - 1);
+        if (virDomainMigrateStartPostCopy(dom, 0) < 0)
+            vshDebug(ctl, VSH_ERR_INFO, "switching to post-copy failed\n");
+    }
+}
+
 static bool
 cmdMigrate(vshControl *ctl, const vshCmd *cmd)
 {
@@ -9875,6 +9896,8 @@ cmdMigrate(vshControl *ctl, const vshCmd *cmd)
     virshMigrateTimeoutAction timeoutAction = VIRSH_MIGRATE_TIMEOUT_DEFAULT;
     bool live_flag = false;
     virshCtrlData data = { .dconn = NULL };
+    virshControlPtr priv = ctl->privData;
+    int iterEvent = -1;
 
     VSH_EXCLUSIVE_OPTIONS("timeout-suspend", "timeout-postcopy");
 
@@ -9907,6 +9930,16 @@ cmdMigrate(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }
 
+    if (vshCommandOptBool(cmd, "postcopy-after-precopy")) {
+        iterEvent = virConnectDomainEventRegisterAny(
+                            priv->conn, dom,
+                            VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION,
+                            VIR_DOMAIN_EVENT_CALLBACK(virshMigrateIteration),
+                            ctl, NULL);
+        if (iterEvent < 0)
+            goto cleanup;
+    }
+
     if (pipe(p) < 0)
         goto cleanup;
 
@@ -9945,6 +9978,8 @@ cmdMigrate(vshControl *ctl, const vshCmd *cmd)
  cleanup:
     if (data.dconn)
         virConnectClose(data.dconn);
+    if (iterEvent != -1)
+        virConnectDomainEventDeregisterAny(priv->conn, iterEvent);
     virDomainFree(dom);
     VIR_FORCE_CLOSE(p[0]);
     VIR_FORCE_CLOSE(p[1]);
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 64b4287..2ace976 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1530,8 +1530,9 @@ to the I<uri> namespace is displayed instead of being modified.
 [I<--persistent>] [I<--undefinesource>] [I<--suspend>] [I<--copy-storage-all>]
 [I<--copy-storage-inc>] [I<--change-protection>] [I<--unsafe>] [I<--verbose>]
 [I<--compressed>] [I<--abort-on-error>] [I<--auto-converge>] [I<--postcopy>]
-I<domain> I<desturi> [I<migrateuri>] [I<graphicsuri>] [I<listen-address>]
-[I<dname>] [I<--timeout> B<seconds> [I<--timeout-suspend> | I<--timeout-postcopy>]]
+[I<--postcopy-after-precopy>] I<domain> I<desturi> [I<migrateuri>]
+[I<graphicsuri>] [I<listen-address>] [I<dname>]
+[I<--timeout> B<seconds> [I<--timeout-suspend> | I<--timeout-postcopy>]]
 [I<--xml> B<file>] [I<--migrate-disks> B<disk-list>]
 
 Migrate domain to another host.  Add I<--live> for live migration; <--p2p>
@@ -1562,7 +1563,9 @@ migration. I<--auto-converge> forces convergence during live migration.
 I<--postcopy> enables post-copy logic in migration, but does not
 actually start post-copy, i.e., migration is started in pre-copy mode.
 Once migration is running, the user may switch to post-copy using the
-B<migrate-postcopy> command sent from another virsh instance.
+B<migrate-postcopy> command sent from another virsh instance or use
+I<--postcopy-after-precopy> to let libvirt automatically switch to
+post-copy after the first pass of pre-copy is finished.
 
 B<Note>: Individual hypervisors usually do not support all possible types of
 migration. For example, QEMU does not support direct migration.
-- 
2.7.0




More information about the libvir-list mailing list