qemu: monitor: Add infrastructure to access VM logs for better err msgs

Early VM startup errors usually produce a better error message in the
machine log file. Currently we were accessing it only when the process
exited during certain phases of startup. This will help adding a more
comprehensive error extraction for early qemu startup phases.

This patch adds infrastructure to keep a file descriptor for the machine
log file that will be used in case an error happens.
This commit is contained in:
Peter Krempa 2013-09-18 16:12:17 +02:00
parent 310651a5e3
commit 8519e9ecdc
2 changed files with 29 additions and 0 deletions

View File

@ -88,6 +88,9 @@ struct _qemuMonitor {
/* If found, path to the virtio memballoon driver */ /* If found, path to the virtio memballoon driver */
char *balloonpath; char *balloonpath;
bool ballooninit; bool ballooninit;
/* Log file fd of the qemu process to dig for usable info */
int logfd;
}; };
static virClassPtr qemuMonitorClass; static virClassPtr qemuMonitorClass;
@ -254,6 +257,7 @@ static void qemuMonitorDispose(void *obj)
VIR_FREE(mon->buffer); VIR_FREE(mon->buffer);
virJSONValueFree(mon->options); virJSONValueFree(mon->options);
VIR_FREE(mon->balloonpath); VIR_FREE(mon->balloonpath);
VIR_FORCE_CLOSE(mon->logfd);
} }
@ -715,6 +719,7 @@ qemuMonitorOpenInternal(virDomainObjPtr vm,
return NULL; return NULL;
mon->fd = -1; mon->fd = -1;
mon->logfd = -1;
if (virCondInit(&mon->notify) < 0) { if (virCondInit(&mon->notify) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot initialize monitor condition")); _("cannot initialize monitor condition"));
@ -3843,3 +3848,25 @@ qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
return qemuMonitorJSONGetDeviceAliases(mon, aliases); return qemuMonitorJSONGetDeviceAliases(mon, aliases);
} }
/**
* qemuMonitorSetDomainLog:
* Set the file descriptor of the open VM log file to report potential
* early startup errors of qemu.
*
* @mon: Monitor object to set the log file reading on
* @logfd: File descriptor of the already open log file
*/
int
qemuMonitorSetDomainLog(qemuMonitorPtr mon, int logfd)
{
VIR_FORCE_CLOSE(mon->logfd);
if (logfd >= 0 &&
(mon->logfd = dup(logfd)) < 0) {
virReportSystemError(errno, "%s", _("failed to duplicate log fd"));
return -1;
}
return 0;
}

View File

@ -761,6 +761,8 @@ int qemuMonitorDetachCharDev(qemuMonitorPtr mon,
int qemuMonitorGetDeviceAliases(qemuMonitorPtr mon, int qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
char ***aliases); char ***aliases);
int qemuMonitorSetDomainLog(qemuMonitorPtr mon, int logfd);
/** /**
* When running two dd process and using <> redirection, we need a * When running two dd process and using <> redirection, we need a
* shell that will not truncate files. These two strings serve that * shell that will not truncate files. These two strings serve that