提交 832d48d7 编写于 作者: N Nikolay Shirokovskiy 提交者: Michal Privoznik

qemu: agent: ignore garbage while waiting for sync reply

After sync is sent we can receive garbare and this is not error.
Consider next regular case:

1. libvirtd sends sync
2. qga sends partial sync reply and die
3. libvirtd sends sync
4. qga sends sync reply
5. libvirtd receives garbage
  (half of first reply and second reply together)

We should handle this situation as it is recoverable.
Next sync can succeed. Let's report reply is NULL,
it will be converted to the VIR_ERR_AGENT_UNSYNCED
which signals client to retry.
上级 4fd25421
...@@ -81,6 +81,8 @@ struct _qemuAgentMessage { ...@@ -81,6 +81,8 @@ struct _qemuAgentMessage {
* fatal error occurred on the monitor channel * fatal error occurred on the monitor channel
*/ */
bool finished; bool finished;
/* true for sync command */
bool sync;
}; };
...@@ -311,8 +313,16 @@ qemuAgentIOProcessLine(qemuAgentPtr mon, ...@@ -311,8 +313,16 @@ qemuAgentIOProcessLine(qemuAgentPtr mon,
VIR_DEBUG("Line [%s]", line); VIR_DEBUG("Line [%s]", line);
if (!(obj = virJSONValueFromString(line))) if (!(obj = virJSONValueFromString(line))) {
/* receiving garbage on sync is regular situation */
if (msg && msg->sync) {
VIR_DEBUG("Received garbage on sync");
msg->finished = 1;
return 0;
}
goto cleanup; goto cleanup;
}
if (obj->type != VIR_JSON_TYPE_OBJECT) { if (obj->type != VIR_JSON_TYPE_OBJECT) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
...@@ -939,6 +949,7 @@ qemuAgentGuestSync(qemuAgentPtr mon) ...@@ -939,6 +949,7 @@ qemuAgentGuestSync(qemuAgentPtr mon)
return -1; return -1;
sync_msg.txLength = strlen(sync_msg.txBuffer); sync_msg.txLength = strlen(sync_msg.txBuffer);
sync_msg.sync = true;
VIR_DEBUG("Sending guest-sync command with ID: %llu", id); VIR_DEBUG("Sending guest-sync command with ID: %llu", id);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册