From 3b5417687d25542d03a2f360f0fe3377c875adbe Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Tue, 14 Jul 2009 18:09:27 -0400 Subject: [PATCH] qemu: Try multiple times to open unix monitor socket Unlike the pty monitor (which we know exists since we scrape its path from stdout), we have no way of knowing that the unix monitor socket should exist/ be initialized. As a result, some of my KVM guests randomly fail to start on F10 host. Try to open the unix socket in a 3 second timeout loop. Ignore EACCES (path does not exist if a first time run) and ECONNREFUSED (leftover socket from a previous run hasn't been removed yet). Fixes things for me. --- src/qemu_driver.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 429235c196..00dc6e5ba7 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -873,6 +873,8 @@ qemudOpenMonitorUnix(virConnectPtr conn, { struct sockaddr_un addr; int monfd; + int timeout = 3; /* In seconds */ + int ret, i; if ((monfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { virReportSystemError(conn, errno, @@ -884,10 +886,28 @@ qemudOpenMonitorUnix(virConnectPtr conn, addr.sun_family = AF_UNIX; strncpy(addr.sun_path, monitor, sizeof(addr.sun_path)); - if (connect(monfd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + do { + ret = connect(monfd, (struct sockaddr *) &addr, sizeof(addr)); + + if (ret == 0) + break; + + if (errno == EACCES || errno == ECONNREFUSED) { + /* EACCES : Socket may not have shown up yet + * ECONNREFUSED : Leftover socket hasn't been removed yet */ + continue; + } + virReportSystemError(conn, errno, "%s", _("failed to connect to monitor socket")); goto error; + + } while ((++i <= timeout*5) && (usleep(.2 * 1000000) <= 0)); + + if (ret != 0) { + virReportSystemError(conn, errno, "%s", + _("monitor socket did not show up.")); + goto error; } if (qemudOpenMonitorCommon(conn, driver, vm, monfd, reconnect) < 0)