提交 2d1f2e70 编写于 作者: D Daniel P. Berrange

Fix problem with QEMU monitor welcome prompt confusing libvirt

after a libvirtd daemon restart with active guests

* src/qemu_driver: Read and dicard pending monitor data
  before issuing new monitor commands.
上级 bf5343d2
...@@ -1744,6 +1744,28 @@ cleanup: ...@@ -1744,6 +1744,28 @@ cleanup:
qemuDriverUnlock(driver); qemuDriverUnlock(driver);
} }
/* Throw away any data available on the monitor
* This is done before executing a command, in order
* to allow re-synchronization if something went badly
* wrong in the past. it also deals with problem of
* QEMU *sometimes* re-printing its initial greeting
* when we reconnect to the monitor after restarts.
*/
static void
qemuMonitorDiscardPendingData(virDomainObjPtr vm) {
char buf[1024];
int ret = 0;
/* Monitor is non-blocking, so just loop till we
* get -1 or 0. Don't bother with detecting
* errors, since we'll deal with that better later */
do {
ret = read(vm->monitor, buf, sizeof (buf)-1);
} while (ret > 0);
}
static int static int
qemudMonitorCommandExtra(const virDomainObjPtr vm, qemudMonitorCommandExtra(const virDomainObjPtr vm,
const char *cmd, const char *cmd,
...@@ -1755,6 +1777,8 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm, ...@@ -1755,6 +1777,8 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm,
size_t cmdlen = strlen(cmd); size_t cmdlen = strlen(cmd);
size_t extralen = extra ? strlen(extra) : 0; size_t extralen = extra ? strlen(extra) : 0;
qemuMonitorDiscardPendingData(vm);
if (safewrite(vm->monitor, cmd, cmdlen) != cmdlen) if (safewrite(vm->monitor, cmd, cmdlen) != cmdlen)
return -1; return -1;
if (safewrite(vm->monitor, "\r", 1) != 1) if (safewrite(vm->monitor, "\r", 1) != 1)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册