From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> Hi, This set attempts to make a race condition between migration and drive-mirror (and other block users) soluble by allowing the migration to be paused after the source qemu releases the block devices but before the serialisation of the device state.
The symptom of this failure, as reported by Wangjie, is a: _co_do_pwritev: Assertion `!(bs->open_flags & 0x0800)' failed and the source qemu dieing; so the problem is pretty nasty. This has only been seen on 2.9 onwards, but the theory is that prior to 2.9 it might have been happening anyway and we were perhaps getting unreported corruptions (lost writes); so this really needs fixing. This flow came from discussions between Kevin and me, and we can't see a way of fixing it without exposing a new state to the management layer. The flow is now: (qemu) migrate_set_capability pause-before-device on (qemu) migrate -d ... (qemu) info migrate ... Migration status: pause-before-device ... << issue commands to clean up any block jobs>> (qemu) migrate_continue pause-before-device (qemu) info migrate ... Migration status: completed This set has been _very_ lightly tested just at the normal migration code, without the addition of the drive mirror; so this is a first cut. I'd appreciate some feedback from libvirt whether the inteface is OK and ideally a hack to test it in a full libvirt setup to see if we hit any other issues. The precopy flow is: active->pause-before-device->completed The postcopy flow is: active->pause-before-device->postcopy-active->completed Although the behaviour with postcopy only gets interesting when we add something like Max's active-sync. Please argue about the command and state naming. Dave Dr. David Alan Gilbert (7): migration: Add 'pause-before-device' capability migration: Add 'pause-before-device' and 'device' statuses migration: Wait for semaphore before completing migration migration: migrate-continue migrate: HMP migate_continue migration: allow cancel to unpause migration: pause-before-device for postcopy hmp-commands.hx | 12 +++++++ hmp.c | 13 +++++++ hmp.h | 1 + migration/migration.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++-- migration/migration.h | 4 +++ qapi/migration.json | 30 ++++++++++++++-- 6 files changed, 152 insertions(+), 4 deletions(-) -- 2.13.6