On 07/21/2014 11:38 PM, chen.fan.fnst(a)cn.fujitsu.com wrote:
On Mon, 2014-07-21 at 22:34 -0600, Eric Blake wrote:
> We were not directly saving the domain XML to file after starting
> or finishing a blockcopy. Without the startup write, a libvirtd
> restart in the middle of a copy job would forget that the job was
> underway. Then at pivot, we were indirectly writing new XML in
> reaction to events that occur as we stop and restart the guest CPUs.
> But there was a race: since pivot is an async action, it is possible
> that the guest is restarted before the pivot completes, so if XML
> changes during the event, that change was not written. The original
> blockcopy code cleared out the <mirror> element prior to restarting
> the CPUs, but this is also a race, observed if a user does an async
> pivot and a dumpxml before the event occurs. Furthermore, this race
> will interfere with active commit, because that code relies on the
> <mirror> element at the time of the qemu event to determine whether
> to inform the user of a normal commit or an active commit.
> +++ b/src/qemu/qemu_process.c
> @@ -1016,6 +1016,7 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
> virObjectEventPtr event2 = NULL;
> const char *path;
> virDomainDiskDefPtr disk;
> + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
Hello Eric,
The cfg should be unref by virObjectUnref(cfg) at the end.
You're right. I also discovered I need to write state after a normal
abort. I'll post an updated version, along with a rebase of my patches
to enable active commit.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org