mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 19:32:19 +00:00
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
|
||||
|
||||
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;
|
||||
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("event from unexpected fd %d!=%d / watch %d!=%d"),
|
||||
mon->fd, fd, mon->watch, watch);
|
||||
error = true;
|
||||
} 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;
|
||||
error = true;
|
||||
} else {
|
||||
@ -581,8 +581,9 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
|
||||
if (!error && !eof &&
|
||||
events & VIR_EVENT_HANDLE_ERROR) {
|
||||
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Error while waiting for monitor"));
|
||||
error = 1;
|
||||
_("Invalid file descriptor while waiting for monitor"));
|
||||
eof = 1;
|
||||
events &= ~VIR_EVENT_HANDLE_ERROR;
|
||||
}
|
||||
if (!error && events) {
|
||||
qemuReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
|
Loading…
x
Reference in New Issue
Block a user