[libvirt] [PATCH v3 00/24] Add support for migration events
John Ferlan
jferlan at redhat.com
Wed Jun 10 14:27:11 UTC 2015
On 06/10/2015 09:42 AM, Jiri Denemark wrote:
> QEMU will soon (patches are available on qemu-devel) get support for
> migration events which will finally allow us to get rid of polling
> query-migrate every 50ms. However, we first need to be able to wait for
> all events related to migration (migration status changes, block job
> events, async abort requests) at once. This series prepares the
> infrastructure and uses it to switch all polling loops in migration code
> to pthread_cond_wait.
>
> https://bugzilla.redhat.com/show_bug.cgi?id=1212077
>
> Version 3 (see individual patches for details):
> - most of the series has been ACKed in v2
> - "qemu: Use domain condition for synchronous block jobs" was split in 3
> patches for easier review
> - minor changes requested in v2 review
>
> Version 2 (see individual patches for details):
> - rewritten using per-domain condition variable
> - enahnced to fully support the migration events
>
>
> Jiri Denemark (24):
> conf: Introduce per-domain condition variable
> qemu: Introduce qemuBlockJobUpdate
> qemu: Properly report failed migration
> qemu: Use domain condition for synchronous block jobs
> qemu: Cancel storage migration in parallel
> qemu: Abort migration early if disk mirror failed
> qemu: Don't mess with disk->mirrorState
> Pass domain object to private data formatter/parser
> qemu: Make qemuMigrationCancelDriveMirror usable without async job
> qemu: Refactor qemuMonitorBlockJobInfo
> qemu: Cancel disk mirrors after libvirtd restart
> qemu: Use domain condition for asyncAbort
> qemu_monitor: Wire up SPICE_MIGRATE_COMPLETED event
> qemu: Do not poll for spice migration status
> qemu: Refactor qemuDomainGetJob{Info,Stats}
> qemu: Refactor qemuMigrationUpdateJobStatus
> qemu: Don't pass redundant job name around
> qemu: Refactor qemuMigrationWaitForCompletion
> qemu_monitor: Wire up MIGRATION event
> qemuDomainGetJobStatsInternal: Support migration events
> qemu: Update migration state according to MIGRATION event
> qemu: Wait for migration events on domain condition
> qemu: cancel drive mirrors when p2p connection breaks
> DO NOT APPLY: qemu: Work around weird migration status changes
>
> po/POTFILES.in | 1 -
> src/conf/domain_conf.c | 51 ++-
> src/conf/domain_conf.h | 12 +-
> src/libvirt_private.syms | 6 +
> src/libxl/libxl_domain.c | 10 +-
> src/lxc/lxc_domain.c | 12 +-
> src/qemu/qemu_blockjob.c | 185 +++--------
> src/qemu/qemu_blockjob.h | 15 +-
> src/qemu/qemu_capabilities.c | 3 +
> src/qemu/qemu_capabilities.h | 1 +
> src/qemu/qemu_domain.c | 78 +++--
> src/qemu/qemu_domain.h | 7 +-
> src/qemu/qemu_driver.c | 201 +++++++-----
> src/qemu/qemu_migration.c | 763 +++++++++++++++++++++++++++++--------------
> src/qemu/qemu_migration.h | 8 +
> src/qemu/qemu_monitor.c | 73 ++++-
> src/qemu/qemu_monitor.h | 33 +-
> src/qemu/qemu_monitor_json.c | 152 ++++-----
> src/qemu/qemu_monitor_json.h | 7 +-
> src/qemu/qemu_process.c | 92 +++++-
> tests/qemumonitorjsontest.c | 40 ---
> 21 files changed, 1057 insertions(+), 693 deletions(-)
>
Just ran this through my Coverity checker - only one issue
RESOURCE_LEAK in qemuMigrationRun:
4235 if (qemuMigrationCheckJobStatus(driver, vm,
4236 QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
(4) Event if_end: End of if statement
4237 goto cancel;
4238
(5) Event open_fn: Returning handle opened by "accept".
(6) Event var_assign: Assigning: "fd" = handle returned from "accept(spec->dest.unix_socket.sock, __SOCKADDR_ARG({ .__sockaddr__ = NULL}), NULL)".
(7) Event cond_false: Condition "(fd = accept(spec->dest.unix_socket.sock, __SOCKADDR_ARG({ .__sockaddr__ = NULL}), NULL)) < 0", taking false branch
Also see events: [leaked_handle]
4239 while ((fd = accept(spec->dest.unix_socket.sock, NULL, NULL)) < 0) {
4240 if (errno == EAGAIN || errno == EINTR)
4241 continue;
...
4252 rc = qemuMigrationWaitForCompletion(driver, vm,
4253 QEMU_ASYNC_JOB_MIGRATION_OUT,
4254 dconn, abort_on_error, !!mig->nbd);
(13) Event cond_true: Condition "rc == -2", taking true branch
4255 if (rc == -2)
(14) Event goto: Jumping to label "cancel"
4256 goto cancel;
4257 else if (rc == -1)
...
4288
(28) Event cond_false: Condition "spec->fwdType != MIGRATION_FWD_DIRECT", taking false branch
4289 if (spec->fwdType != MIGRATION_FWD_DIRECT) {
4290 if (iothread && qemuMigrationStopTunnel(iothread, ret < 0) < 0)
4291 ret = -1;
4292 VIR_FORCE_CLOSE(fd);
(29) Event if_end: End of if statement
4293 }
4294
...
4322 }
4323
(38) Event leaked_handle: Handle variable "fd" going out of scope leaks the handle.
Also see events: [open_fn][var_assign]
4324 return ret;
4325
4326 exit_monitor:
4327 ignore_value(qemuDomainObjExitMonitor(driver, vm));
4328 goto cleanup;
4329
(15) Event label: Reached label "cancel"
4330 cancel:
4331 orig_err = virSaveLastError();
4332
(16) Event cond_true: Condition "virDomainObjIsActive(vm)", taking true branch
...
More information about the libvir-list
mailing list