Fix handling of VIR_EVENT_HANDLE_ERROR in QEMU monitor
Commit 4454a9efc728b91e791b1f14c26ea23a19d57f48 introduced bad behaviour on the VIR_EVENT_HANDLE_ERROR condition. This condition is only hit when an invalid FD is used in poll() (typically due to a double-close bug). The QEMU monitor code was treating this condition as non-fatal, and thus libvirt would poll() in a fast loop forever burning 100% CPU. VIR_EVENT_HANDLE_ERROR must be handled in the same way as VIR_EVENT_HANDLE_HANGUP, killing the QEMU instance. * src/qemu/qemu_monitor.c: Treat VIR_EVENT_HANDLE_ERROR as EOF
This commit is contained in:
parent
ebfb8c4243
commit
43917db3f9
@ -535,14 +535,14 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (mon->fd != fd || mon->watch != watch) {
|
if (mon->fd != fd || mon->watch != watch) {
|
||||||
if (events & VIR_EVENT_HANDLE_HANGUP)
|
if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
|
||||||
eof = true;
|
eof = true;
|
||||||
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("event from unexpected fd %d!=%d / watch %d!=%d"),
|
_("event from unexpected fd %d!=%d / watch %d!=%d"),
|
||||||
mon->fd, fd, mon->watch, watch);
|
mon->fd, fd, mon->watch, watch);
|
||||||
error = true;
|
error = true;
|
||||||
} else if (mon->lastError.code != VIR_ERR_OK) {
|
} else if (mon->lastError.code != VIR_ERR_OK) {
|
||||||
if (events & VIR_EVENT_HANDLE_HANGUP)
|
if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
|
||||||
eof = true;
|
eof = true;
|
||||||
error = true;
|
error = true;
|
||||||
} else {
|
} else {
|
||||||
@ -581,8 +581,9 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
|
|||||||
if (!error && !eof &&
|
if (!error && !eof &&
|
||||||
events & VIR_EVENT_HANDLE_ERROR) {
|
events & VIR_EVENT_HANDLE_ERROR) {
|
||||||
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Error while waiting for monitor"));
|
_("Invalid file descriptor while waiting for monitor"));
|
||||||
error = 1;
|
eof = 1;
|
||||||
|
events &= ~VIR_EVENT_HANDLE_ERROR;
|
||||||
}
|
}
|
||||||
if (!error && events) {
|
if (!error && events) {
|
||||||
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user