On 08.04.2015 08:35, Michael Chapman wrote:
On Fri, 13 Mar 2015, Peter Krempa wrote:
> Surprisingly we did not grab a VM job when a block job finished and we'd
> happily rewrite the backing chain data. This made it possible to crash
> libvirt when queueing two backing chains tightly and other badness.
>
> To fix it, add yet another handler to the helper thread that handles
> monitor events that require a job.
Hi Peter,
Unfortunately, I think this change has broken disk mirroring during
migration. When a disk mirror is ready (or aborted),
processBlockJobEvent blocks when beginning its MODIFY job because of the
ongoing MIGRATION_OUT async job.
Yes, I've already told Peter in person a week ago.
I'd like to solve this by making use of blockJobSync from within
qemuMigrationDriveMirror. This is also going to fix another bug where
libvirt doesn't wait for QEMU to complete the drive mirroring before
migrating a VM (leading to disk corruption if there's ongoing writes!)
The plan would be to move qemuBlockJobEventProcess into a separate
qemu_blockjob.c, so it can be used from both qemu_driver and
qemu_migration, along with a few helper functions to set up blockJobSync
and to wait for it to be notified. Do you think this would be a suitable
approach?
Sounds good to me.
Michal