[libvirt] [PATCH v5 3/4] blockcommit: track job type in xml
Eric Blake
eblake at redhat.com
Tue Jul 29 21:01:57 UTC 2014
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 539 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140729/e66fcb13/attachment-0001.sig>
More information about the libvir-list
mailing list