mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 09:14:57 +00:00
qemu: Propagate QEMU errors during incoming migrations
When QEMU fails during incoming migration after we successfully started it (i.e., during Perform or Finish phase), we report a rather unhelpful message Unable to read from monitor: Connection reset by peer We already have a code that takes error messages from QEMU's error output but we disable it once QEMU successfully starts. This patch postpones this until the end of Finish phase during incoming migration so that we can report a much better error message: internal error: early end of file from monitor: possible problem: Unknown savevm section or instance '0000:00:05.0/virtio-balloon' 0 load of migration failed https://bugzilla.redhat.com/show_bug.cgi?id=1090093 Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
2990db96b6
commit
03890605dc
@ -4689,6 +4689,8 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
|
|||||||
cleanup:
|
cleanup:
|
||||||
virPortAllocatorRelease(driver->migrationPorts, port);
|
virPortAllocatorRelease(driver->migrationPorts, port);
|
||||||
if (vm) {
|
if (vm) {
|
||||||
|
if (priv->mon)
|
||||||
|
qemuMonitorSetDomainLog(priv->mon, -1);
|
||||||
VIR_FREE(priv->origname);
|
VIR_FREE(priv->origname);
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
}
|
}
|
||||||
|
@ -631,8 +631,11 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque)
|
|||||||
error = true;
|
error = true;
|
||||||
} else {
|
} else {
|
||||||
if (events & VIR_EVENT_HANDLE_WRITABLE) {
|
if (events & VIR_EVENT_HANDLE_WRITABLE) {
|
||||||
if (qemuMonitorIOWrite(mon) < 0)
|
if (qemuMonitorIOWrite(mon) < 0) {
|
||||||
error = true;
|
error = true;
|
||||||
|
if (errno == ECONNRESET)
|
||||||
|
hangup = true;
|
||||||
|
}
|
||||||
events &= ~VIR_EVENT_HANDLE_WRITABLE;
|
events &= ~VIR_EVENT_HANDLE_WRITABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -642,6 +645,8 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque)
|
|||||||
events &= ~VIR_EVENT_HANDLE_READABLE;
|
events &= ~VIR_EVENT_HANDLE_READABLE;
|
||||||
if (got < 0) {
|
if (got < 0) {
|
||||||
error = true;
|
error = true;
|
||||||
|
if (errno == ECONNRESET)
|
||||||
|
hangup = true;
|
||||||
} else if (got == 0) {
|
} else if (got == 0) {
|
||||||
eof = true;
|
eof = true;
|
||||||
} else {
|
} else {
|
||||||
@ -683,8 +688,9 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque)
|
|||||||
if (hangup) {
|
if (hangup) {
|
||||||
/* Check if an error message from qemu is available and if so, use
|
/* Check if an error message from qemu is available and if so, use
|
||||||
* it to overwrite the actual message. It's done only in early
|
* it to overwrite the actual message. It's done only in early
|
||||||
* startup phases where the message from qemu is certainly more
|
* startup phases or during incoming migration when the message
|
||||||
* interesting than a "connection reset by peer" message.
|
* from qemu is certainly more interesting than a
|
||||||
|
* "connection reset by peer" message.
|
||||||
*/
|
*/
|
||||||
char *qemuMessage;
|
char *qemuMessage;
|
||||||
|
|
||||||
|
@ -4379,8 +4379,10 @@ int qemuProcessStart(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unset reporting errors from qemu log */
|
/* Keep watching qemu log for errors during incoming migration, otherwise
|
||||||
qemuMonitorSetDomainLog(priv->mon, -1);
|
* unset reporting errors from qemu log. */
|
||||||
|
if (!migrateFrom)
|
||||||
|
qemuMonitorSetDomainLog(priv->mon, -1);
|
||||||
|
|
||||||
virCommandFree(cmd);
|
virCommandFree(cmd);
|
||||||
VIR_FORCE_CLOSE(logfile);
|
VIR_FORCE_CLOSE(logfile);
|
||||||
|
Loading…
Reference in New Issue
Block a user