[libvirt] [PATCHv9 2/9] blockjob: react to active block copy

Peter Krempa pkrempa at redhat.com
Thu Oct 25 20:57:53 UTC 2012


On 10/23/12 04:10, Eric Blake wrote:
> For now, disk migration via block copy job is not implemented in
> libvirt.  But when we do implement it, we have to deal with the
> fact that qemu does not yet provide an easy way to re-start a qemu
> process with mirroring still intact.  Paolo has proposed an idea
> for a persistent dirty bitmap that might make this possible, but
> until that design is complete, it's hard to say what changes
> libvirt would need.  Even something like 'virDomainSave' becomes
> hairy, if you realize the implications that 'virDomainRestore'
> would be stuck with recreating the same mirror layout.
>
> But if we step back and look at the bigger picture, we realize that
> the initial client of live storage migration via disk mirroring is
> oVirt, which always uses transient domains, and that if a transient
> domain is destroyed while a mirror exists, oVirt can easily restart
> the storage migration by creating a new domain that visits just the
> source storage, with no loss in data.
>
> We can make life a lot easier by being cowards for now, forbidding
> certain operations on a domain.  This patch guarantees that we
> never get in a state where we would have to restart a domain with
> a mirroring block copy, by preventing saves, snapshots, migration,
> hot unplug of a disk in use, and conversion to a persistent domain
> (thankfully, it is still relatively easy to 'virsh undefine' a
> running domain to temporarily make it transient, run tests on
> 'virsh blockcopy', then 'virsh define' to restore the persistence).
> Later, if the qemu design is enhanced, we can relax our code.
>
> The change to qemudDomainDefine looks a bit odd for undoing an
> assignment, rather than probing up front to avoid the assignment,
> but this is because of how virDomainAssignDef combines both a
> lookup and assignment into a single function call.
>
> * src/conf/domain_conf.h (virDomainHasDiskMirror): New prototype.
> * src/conf/domain_conf.c (virDomainHasDiskMirror): New function.
> * src/libvirt_private.syms (domain_conf.h): Export it.
> * src/qemu/qemu_driver.c (qemuDomainSaveInternal)
> (qemuDomainSnapshotCreateXML, qemuDomainRevertToSnapshot)
> (qemuDomainBlockJobImpl, qemudDomainDefine): Prevent dangerous
> actions while block copy is already in action.
> * src/qemu/qemu_hotplug.c (qemuDomainDetachDiskDevice): Likewise.
> * src/qemu/qemu_migration.c (qemuMigrationIsAllowed): Likewise.
> ---
>
> v9: also inhibit migration during active block job
>
>   src/conf/domain_conf.c    | 12 ++++++++++++
>   src/conf/domain_conf.h    |  1 +
>   src/libvirt_private.syms  |  1 +
>   src/qemu/qemu_driver.c    | 29 +++++++++++++++++++++++++++++
>   src/qemu/qemu_hotplug.c   |  7 +++++++
>   src/qemu/qemu_migration.c |  5 +++++
>   6 files changed, 55 insertions(+)
>

ACK.

Peter




More information about the libvir-list mailing list