qemu: MIGRATION.txt: Move to kbase and rSTisze

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2022-05-13 13:13:02 +02:00
parent b414c4a00a
commit 1095803ffa
3 changed files with 40 additions and 31 deletions

View File

@ -104,3 +104,6 @@ Internals
`QEMU driver threading <internals/qemu-threads.html>`__ `QEMU driver threading <internals/qemu-threads.html>`__
Basics of locking and threaded access to qemu driver primitives. Basics of locking and threaded access to qemu driver primitives.
`QEMU migration internals <internals/qemu-migration.html>`__
Description of migration phases in the ``v2`` and ``v3`` migration protocol.

View File

@ -5,6 +5,7 @@ docs_kbase_internals_files = [
'locking', 'locking',
'migration', 'migration',
'overview', 'overview',
'qemu-migration',
'qemu-threads', 'qemu-threads',
'rpc', 'rpc',
] ]

View File

@ -1,84 +1,89 @@
QEMU Migration Phases QEMU Migration Phases
===================== =====================
.. contents::
QEMU supports only migration protocols 2 and 3 (1 was lacking too many QEMU supports only migration protocols 2 and 3 (1 was lacking too many
steps). Repeating the protocol sequences from libvirt.c: 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 - Generate XML to pass to dst
Dst: Prepare **Dst**: ``Prepare``
- Get ready to accept incoming VM - Get ready to accept incoming VM
- Generate optional cookie to pass to src - Generate optional cookie to pass to src
Src: Perform **Src**: ``Perform``
- Start migration and wait for send completion - Start migration and wait for send completion
- Kill off VM if successful, resume if failed - Kill off VM if successful, resume if failed
Dst: Finish **Dst**: ``Finish``
- Wait for recv completion and check status - Wait for recv completion and check status
- Kill off VM if unsuccessful - Kill off VM if unsuccessful
Sequence v3: Migration protocol v3 API Sequence
----------------------------------
Src: Begin **Src**: ``Begin``
- Generate XML to pass to dst - Generate XML to pass to dst
- Generate optional cookie to pass to dst - Generate optional cookie to pass to dst
Dst: Prepare **Dst**: ``Prepare``
- Get ready to accept incoming VM - Get ready to accept incoming VM
- Generate optional cookie to pass to src - Generate optional cookie to pass to src
Src: Perform **Src**: ``Perform``
- Start migration and wait for send completion - Start migration and wait for send completion
- Generate optional cookie to pass to dst - Generate optional cookie to pass to dst
Dst: Finish **Dst**: ``Finish``
- Wait for recv completion and check status - Wait for recv completion and check status
- Kill off VM if failed, resume if success - Kill off VM if failed, resume if success
- Generate optional cookie to pass to src - Generate optional cookie to pass to src
Src: Confirm **Src**: ``Confirm``
- Kill off VM if success, resume if failed - 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 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 source and destination side and we need to keep the domain we are migrating in
a consistent state during the whole process. a consistent state during the whole process.
To avoid anyone from changing the domain in the middle of migration we need to 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 keep ``MIGRATION_OUT`` job active during migration from ``Begin`` to
source side and MIGRATION_IN job has to be active from Prepare to Finish on ``Confirm`` on the source side and ``MIGRATION_IN`` job has to be active from
the destination side. ``Prepare`` to ``Finish`` on the destination side.
For this purpose we introduce several helper methods to deal with locking 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 - The first API of a migration protocol (``Prepare`` or ``Perform/Begin``
migration type and version) has to start migration job and keep it active: depending on migration type and version) has to start migration job and keep
it active::
qemuMigrationJobStart(driver, vm, VIR_JOB_MIGRATION_{IN,OUT}); qemuMigrationJobStart(driver, vm, VIR_JOB_MIGRATION_{IN,OUT});
qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_*); qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_*);
...do work... ...do work...
qemuMigrationJobContinue(vm); 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})) if (!qemuMigrationJobIsActive(vm, VIR_JOB_MIGRATION_{IN,OUT}))
return; return;
@ -86,7 +91,7 @@ The sequence of calling qemuMigrationJob* helper methods is as follows:
...do work... ...do work...
qemuMigrationJobContinue(vm); 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})) if (!qemuMigrationJobIsActive(vm, VIR_JOB_MIGRATION_{IN,OUT}))
return; return;
@ -94,7 +99,7 @@ The sequence of calling qemuMigrationJob* helper methods is as follows:
...do work... ...do work...
qemuMigrationJobFinish(driver, vm); qemuMigrationJobFinish(driver, vm);
While migration job is running (i.e., after qemuMigrationJobStart* but before While migration job is running (i.e., after ``qemuMigrationJobStart*`` but before
qemuMigrationJob{Continue,Finish}), migration phase can be advanced using ``qemuMigrationJob{Continue,Finish}``), migration phase can be advanced using::
qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_*); qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_*);