mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 07:59:00 +00:00
usleep to wait for domain logfile to fill up
This commit is contained in:
parent
e9c920ba67
commit
6efe591e66
@ -1,3 +1,12 @@
|
|||||||
|
Fri Feb 13 12:31:03 CET 2009 Guido Günther <agx@sigxcpu.org>
|
||||||
|
|
||||||
|
usleep to wait for domain logfile to fill up
|
||||||
|
* src/qemu_driver.c (qemudReadLogOutput): New function to read from
|
||||||
|
domain log file.
|
||||||
|
(qemudWaitForMonitor): Use it.
|
||||||
|
(qemudOpenMonitor): Pass timout in seconds.
|
||||||
|
(qemudReadMonitorOutput): Convert timout to milliseconds.
|
||||||
|
|
||||||
Wed Feb 11 21:30:47 CET 2009 Guido Günther <agx@sigxcpu.org>
|
Wed Feb 11 21:30:47 CET 2009 Guido Günther <agx@sigxcpu.org>
|
||||||
|
|
||||||
* src/qemu_driver.c (qemudStartVMDaemon): fix return status when
|
* src/qemu_driver.c (qemudStartVMDaemon): fix return status when
|
||||||
|
@ -601,6 +601,7 @@ qemudReadMonitorOutput(virConnectPtr conn,
|
|||||||
{
|
{
|
||||||
int got = 0;
|
int got = 0;
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
|
timeout *= 1000; /* poll wants milli seconds */
|
||||||
|
|
||||||
/* Consume & discard the initial greeting */
|
/* Consume & discard the initial greeting */
|
||||||
while (got < (buflen-1)) {
|
while (got < (buflen-1)) {
|
||||||
@ -662,6 +663,56 @@ qemudReadMonitorOutput(virConnectPtr conn,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns -1 for error, 0 on success
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
qemudReadLogOutput(virConnectPtr conn,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
int fd,
|
||||||
|
char *buf,
|
||||||
|
int buflen,
|
||||||
|
qemudHandlerMonitorOutput func,
|
||||||
|
const char *what,
|
||||||
|
int timeout)
|
||||||
|
{
|
||||||
|
int got = 0;
|
||||||
|
int ret;
|
||||||
|
int retries = timeout*10;
|
||||||
|
buf[0] = '\0';
|
||||||
|
|
||||||
|
while (retries) {
|
||||||
|
while((ret = read(fd, buf+got, buflen-got-1)) > 0) {
|
||||||
|
got += ret;
|
||||||
|
buf[got] = '\0';
|
||||||
|
if ((buflen-got-1) == 0) {
|
||||||
|
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Out of space while reading %s log output"), what);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret < 0 && errno != EINTR) {
|
||||||
|
virReportSystemError(conn, errno,
|
||||||
|
_("Failure while reading %s log output"),
|
||||||
|
what);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = func(conn, vm, buf, fd);
|
||||||
|
if (ret <= 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
usleep(100*1000);
|
||||||
|
retries--;
|
||||||
|
}
|
||||||
|
if (retries == 0)
|
||||||
|
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Timed out while reading %s log output"), what);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemudCheckMonitorPrompt(virConnectPtr conn ATTRIBUTE_UNUSED,
|
qemudCheckMonitorPrompt(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
@ -706,7 +757,7 @@ static int qemudOpenMonitor(virConnectPtr conn,
|
|||||||
vm, monfd,
|
vm, monfd,
|
||||||
buf, sizeof(buf),
|
buf, sizeof(buf),
|
||||||
qemudCheckMonitorPrompt,
|
qemudCheckMonitorPrompt,
|
||||||
"monitor", 10000) <= 0)
|
"monitor", 10) <= 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
else
|
else
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -738,6 +789,7 @@ static int qemudOpenMonitor(virConnectPtr conn,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns -1 for error, 0 success, 1 continue reading */
|
||||||
static int qemudExtractMonitorPath(virConnectPtr conn,
|
static int qemudExtractMonitorPath(virConnectPtr conn,
|
||||||
const char *haystack,
|
const char *haystack,
|
||||||
size_t *offset,
|
size_t *offset,
|
||||||
@ -841,21 +893,18 @@ static int qemudWaitForMonitor(virConnectPtr conn,
|
|||||||
< 0)
|
< 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = qemudReadMonitorOutput(conn, vm, logfd, buf, sizeof(buf),
|
ret = qemudReadLogOutput(conn, vm, logfd, buf, sizeof(buf),
|
||||||
qemudFindCharDevicePTYs,
|
qemudFindCharDevicePTYs,
|
||||||
"console", 3000);
|
"console", 3);
|
||||||
if (close(logfd) < 0) {
|
if (close(logfd) < 0) {
|
||||||
char ebuf[1024];
|
char ebuf[1024];
|
||||||
qemudLog(QEMUD_WARN, _("Unable to close logfile: %s\n"),
|
qemudLog(QEMUD_WARN, _("Unable to close logfile: %s\n"),
|
||||||
virStrerror(errno, ebuf, sizeof ebuf));
|
virStrerror(errno, ebuf, sizeof ebuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == 1) /* Success */
|
if (ret == 0) /* success */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (ret == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Unexpected end of file - inform user of QEMU log data */
|
/* Unexpected end of file - inform user of QEMU log data */
|
||||||
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
|
||||||
_("unable to start guest: %s"), buf);
|
_("unable to start guest: %s"), buf);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user