
On 07/29/2014 07:03 AM, Peter Krempa wrote:
On 07/29/14 06:20, Eric Blake wrote:
A future patch is going to wire up qemu active block commit jobs; but as they have similar events and are canceled/pivoted in the same way as block copy jobs, it is easiest to track all bookkeeping for the commit job by reusing the <mirror> element. This patch adds domain XML to track which job was responsible for creating a mirroring situation, and adds a job='copy' attribute to all existing uses of <mirror>. Along the way, it also massages the qemu monitor backend to read the new field in order to generate the correct type of libvirt job (even though it requires a future patch to actually cause a qemu event that can be reported as an active commit). It also prepares to update persistent XML to match changes made to live XML when a copy completes.
@@ -1025,6 +1026,9 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED, if (disk) { /* Have to generate two variants of the event for old vs. new * client callbacks */ + if (type == VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT && + disk->mirrorJob == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT) + type = disk->mirrorJob;
Hmm, looks like this would be better of in the next patch but one of the tests probably wouldn't work without this.
Maybe, but then the next commit doesn't look so deceptively simple, and I _did_ mention it in the commit message :)
if (disk->mirrorState == VIR_DOMAIN_DISK_MIRROR_PIVOT) { + if (vm->newDef) { + int indx = virDomainDiskIndexByName(vm->newDef, disk->dst, + false);
+ if (copy) { + virStorageSourceFree(persistDisk->src); + persistDisk->src = copy; + } + }
Won't this allow us to enable block copy on persistent domains?
It's part of the effort. The other half is actually being able to restart a blockcopy operation across qemu restarts (not available in qemu 2.1, it requires a persistent bitmap; but might be available in qemu 2.2). The reason that active commit can be done on a persistent domain is that you don't lose progress - if you spend 4 minutes getting 80% of the way, then the guest shuts down, then you restart qemu and restart the commit operation, then you only need 1 more minute for the remaining 20%. That is, aborting a commit job is not expensive. On the other hand, aborting a copy job at 80% progress, and then starting a new one, will end up copying all 100% of the file (5 more minutes, for a total of 9 instead of 5), because without a persistent bitmap, qemu loses track of how much of the copy has already been made. So for now, I'm still going to require transient domain for blockcopy. That, and I _really_ need a new API that lets you target a <disk> XML element as the copy destination (I ran out of time for 1.2.7, but 1.2.8 is looking good). Plus we need a way to expose qemu's drive-backup operation; the existing blockcopy code is crammed into virDomainBlockRebase where we don't have good exposure for pre- vs. post- snapshot; but a new virDomainBlockCopy() with an XML destination and proper flags would be better for it. For those less familiar with the difference between the two qemu commands, here's a timeline: A B C +---------------------------------------------------------- ^ ^ ^ request drive-mirror | | sync ready request complete/pivot the copy taken by drive-mirror is consistent at point C, which may be several minutes after the user actually requested the copy. So whatever the guest saw at point A may be long gone by the time the copy is actually finalized; planning for user point-in-time snapshots requires forethought to actually get a mirror up and running long before the user has a need for the snapshot. However, with that planning, the time between declaring the snapshot complete and actually having the snapshot to work with is nearly instant. A B +------------------------------------------ ^ ^ request drive-backup | backup complete the copy taken by drive-backup is not consistent until point B, but its contents match what the guest saw at point A. This is much nicer for point-in-time semantics, although it does mean that the user has to wait from the time they requested a backup until it is actually ready for them to use.
ACK, although this patch an the next one are a bit borderline now that libvirt is frozen for the next release.
I'll wait for a third-party opinion, then (maybe DV or danpb will weigh in before DV tries to cut rc2 in the next 24 hours...) -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org