• E
    blockjob: react to active block copy · b3822ed0
    Eric Blake 提交于
    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.
    b3822ed0
libvirt_private.syms 40.3 KB