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