- QEMU Migration Phases
- =====================
+QEMU Migration Phases
+=====================
+
+.. contents::
QEMU supports only migration protocols 2 and 3 (1 was lacking too many
steps). Repeating the protocol sequences from libvirt.c:
-Sequence v2:
+Migration protocol v2 API Sequence
+----------------------------------
- Src: DumpXML
+ **Src**: ``DumpXML``
- Generate XML to pass to dst
- Dst: Prepare
+ **Dst**: ``Prepare``
- Get ready to accept incoming VM
- Generate optional cookie to pass to src
- Src: Perform
+ **Src**: ``Perform``
- Start migration and wait for send completion
- Kill off VM if successful, resume if failed
- Dst: Finish
+ **Dst**: ``Finish``
- Wait for recv completion and check status
- Kill off VM if unsuccessful
-Sequence v3:
+Migration protocol v3 API Sequence
+----------------------------------
- Src: Begin
+ **Src**: ``Begin``
- Generate XML to pass to dst
- Generate optional cookie to pass to dst
- Dst: Prepare
+ **Dst**: ``Prepare``
- Get ready to accept incoming VM
- Generate optional cookie to pass to src
- Src: Perform
+ **Src**: ``Perform``
- Start migration and wait for send completion
- Generate optional cookie to pass to dst
- Dst: Finish
+ **Dst**: ``Finish``
- Wait for recv completion and check status
- Kill off VM if failed, resume if success
- Generate optional cookie to pass to src
- Src: Confirm
+ **Src**: ``Confirm``
- Kill off VM if success, resume if failed
- QEMU Migration Locking Rules
- ============================
+QEMU Migration Locking Rules
+============================
Migration is a complicated beast which may span across several APIs on both
source and destination side and we need to keep the domain we are migrating in
a consistent state during the whole process.
To avoid anyone from changing the domain in the middle of migration we need to
-keep MIGRATION_OUT job active during migration from Begin to Confirm on the
-source side and MIGRATION_IN job has to be active from Prepare to Finish on
-the destination side.
+keep ``MIGRATION_OUT`` job active during migration from ``Begin`` to
+``Confirm`` on the source side and ``MIGRATION_IN`` job has to be active from
+``Prepare`` to ``Finish`` on the destination side.
For this purpose we introduce several helper methods to deal with locking
-primitives (described in THREADS.txt) in the right way:
+primitives (described in `qemu-threads <qemu-threads.html>`__) in the right way:
-* qemuMigrationJobStart
+* ``qemuMigrationJobStart``
-* qemuMigrationJobContinue
+* ``qemuMigrationJobContinue``
-* qemuMigrationJobStartPhase
+* ``qemuMigrationJobStartPhase``
-* qemuMigrationJobSetPhase
+* ``qemuMigrationJobSetPhase``
-* qemuMigrationJobFinish
+* ``qemuMigrationJobFinish``
-The sequence of calling qemuMigrationJob* helper methods is as follows:
+The sequence of calling ``qemuMigrationJob*`` helper methods is as follows:
-- The first API of a migration protocol (Prepare or Perform/Begin depending on
- migration type and version) has to start migration job and keep it active:
+- The first API of a migration protocol (``Prepare`` or ``Perform/Begin``
+ depending on migration type and version) has to start migration job and keep
+ it active::
qemuMigrationJobStart(driver, vm, VIR_JOB_MIGRATION_{IN,OUT});
qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_*);
...do work...
qemuMigrationJobContinue(vm);
-- All consequent phases except for the last one have to keep the job active:
+- All consequent phases except for the last one have to keep the job active::
if (!qemuMigrationJobIsActive(vm, VIR_JOB_MIGRATION_{IN,OUT}))
return;
...do work...
qemuMigrationJobContinue(vm);
-- The last migration phase finally finishes the migration job:
+- The last migration phase finally finishes the migration job::
if (!qemuMigrationJobIsActive(vm, VIR_JOB_MIGRATION_{IN,OUT}))
return;
...do work...
qemuMigrationJobFinish(driver, vm);
-While migration job is running (i.e., after qemuMigrationJobStart* but before
-qemuMigrationJob{Continue,Finish}), migration phase can be advanced using
+While migration job is running (i.e., after ``qemuMigrationJobStart*`` but before
+``qemuMigrationJob{Continue,Finish}``), migration phase can be advanced using::
qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_*);