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.
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?
- Michael