
On Tue, Aug 16, 2011 at 18:39:12 +0200, Michal Privoznik wrote:
If libvirt daemon gets restarted and there is (at least) one unresponsive qemu, the startup procedure hangs up. This patch creates one thread per vm in which we try to reconnect to monitor. Therefore, blocking in one thread will not affect other APIs. --- src/qemu/qemu_driver.c | 23 +++--------- src/qemu/qemu_process.c | 87 ++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 85 insertions(+), 25 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 421a98e..4574b6c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -143,26 +143,15 @@ qemuAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaq
virDomainObjLock(vm); virResetLastError(); - if (qemuDomainObjBeginJobWithDriver(data->driver, vm, - QEMU_JOB_MODIFY) < 0) { + if (vm->autostart && + !virDomainObjIsActive(vm) && + qemuDomainObjStart(data->conn, data->driver, vm, + false, false, + data->driver->autoStartBypassCache) < 0) { err = virGetLastError(); - VIR_ERROR(_("Failed to start job on VM '%s': %s"), + VIR_ERROR(_("Failed to autostart VM '%s': %s"), vm->def->name, err ? err->message : _("unknown error")); - } else { - if (vm->autostart && - !virDomainObjIsActive(vm) && - qemuDomainObjStart(data->conn, data->driver, vm, - false, false, - data->driver->autoStartBypassCache) < 0) { - err = virGetLastError(); - VIR_ERROR(_("Failed to autostart VM '%s': %s"), - vm->def->name, - err ? err->message : _("unknown error")); - } - - if (qemuDomainObjEndJob(data->driver, vm) == 0) - vm = NULL; }
I think this is wrong. qemuDomainObjStart expect the job to be set so that it can enter qemu monitor. The patch should just move the if (vm->autostrt && !virDomainObjIsActive(vm)) check before BeginJob so that a job is started only if we're going to do something with the domain. Jirka