提交 56258a38 编写于 作者: J Jiri Denemark

qemu: Don't use query-migrate on destination

When migration fails, we need to poke QEMU monitor to check for a reason
of the failure. We did this using query-migrate QMP command, which is
not supposed to return any meaningful result on the destination side.
Thus if the monitor was still functional when we detected the migration
failure, parsing the answer from query-migrate always failed with the
following error message:

    "info migration reply was missing return status"

This irrelevant message was then used as the reason for the migration
failure replacing any message we might have had.

Let's use harmless query-status for poking the monitor to make sure we
only get an error if the monitor connection is broken.

https://bugzilla.redhat.com/show_bug.cgi?id=1374613Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
上级 c8b8bbc3
...@@ -6127,3 +6127,23 @@ qemuDomainVcpuPersistOrder(virDomainDefPtr def) ...@@ -6127,3 +6127,23 @@ qemuDomainVcpuPersistOrder(virDomainDefPtr def)
} }
} }
} }
int
qemuDomainCheckMonitor(virQEMUDriverPtr driver,
virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
int ret;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
ret = qemuMonitorCheck(priv->mon);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
return ret;
}
...@@ -728,4 +728,8 @@ bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def) ...@@ -728,4 +728,8 @@ bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
void qemuDomainVcpuPersistOrder(virDomainDefPtr def) void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob);
#endif /* __QEMU_DOMAIN_H__ */ #endif /* __QEMU_DOMAIN_H__ */
...@@ -6208,14 +6208,10 @@ qemuMigrationFinish(virQEMUDriverPtr driver, ...@@ -6208,14 +6208,10 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
} }
if (retcode != 0) { if (retcode != 0) {
qemuDomainJobInfo info;
/* Check for a possible error on the monitor in case Finish was called /* Check for a possible error on the monitor in case Finish was called
* earlier than monitor EOF handler got a chance to process the error * earlier than monitor EOF handler got a chance to process the error
*/ */
qemuMigrationFetchJobStatus(driver, vm, qemuDomainCheckMonitor(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN);
QEMU_ASYNC_JOB_MIGRATION_IN,
&info);
goto endjob; goto endjob;
} }
......
...@@ -1616,6 +1616,14 @@ qemuMonitorStopCPUs(qemuMonitorPtr mon) ...@@ -1616,6 +1616,14 @@ qemuMonitorStopCPUs(qemuMonitorPtr mon)
} }
int
qemuMonitorCheck(qemuMonitorPtr mon)
{
bool running;
return qemuMonitorGetStatus(mon, &running, NULL);
}
int int
qemuMonitorGetStatus(qemuMonitorPtr mon, qemuMonitorGetStatus(qemuMonitorPtr mon,
bool *running, bool *running,
......
...@@ -382,6 +382,7 @@ typedef enum { ...@@ -382,6 +382,7 @@ typedef enum {
VIR_ENUM_DECL(qemuMonitorVMStatus) VIR_ENUM_DECL(qemuMonitorVMStatus)
int qemuMonitorVMStatusToPausedReason(const char *status); int qemuMonitorVMStatusToPausedReason(const char *status);
int qemuMonitorCheck(qemuMonitorPtr mon);
int qemuMonitorGetStatus(qemuMonitorPtr mon, int qemuMonitorGetStatus(qemuMonitorPtr mon,
bool *running, bool *running,
virDomainPausedReason *reason) virDomainPausedReason *reason)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册