From 3f90a1aac06fcc741a851e1eefb0f7eb4538ffcf Mon Sep 17 00:00:00 2001 From: Nikolay Shirokovskiy Date: Fri, 16 Sep 2016 13:35:35 +0300 Subject: [PATCH] qemu: agent: reissue sync on garbage sync reply We can easily handle receiving garbage on sync. We don't have to make client deal with this situation. We just need to resend sync command but this time garbage is not be possible. --- src/qemu/qemu_agent.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index a856012450..f3d54f6bac 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -85,6 +85,7 @@ struct _qemuAgentMessage { bool sync; /* id of the issued sync comand */ unsigned long long id; + bool first; }; @@ -316,8 +317,8 @@ qemuAgentIOProcessLine(qemuAgentPtr mon, VIR_DEBUG("Line [%s]", line); if (!(obj = virJSONValueFromString(line))) { - /* receiving garbage on sync is regular situation */ - if (msg && msg->sync) { + /* receiving garbage on first sync is regular situation */ + if (msg && msg->sync && msg->first) { VIR_DEBUG("Received garbage on sync"); msg->finished = 1; return 0; @@ -959,7 +960,10 @@ qemuAgentGuestSync(qemuAgentPtr mon) qemuAgentMessage sync_msg; memset(&sync_msg, 0, sizeof(sync_msg)); + /* set only on first sync */ + sync_msg.first = true; + retry: if (virTimeMillisNow(&id) < 0) return -1; @@ -983,9 +987,15 @@ qemuAgentGuestSync(qemuAgentPtr mon) goto cleanup; if (!sync_msg.rxObject) { - virReportError(VIR_ERR_AGENT_UNSYNCED, "%s", - _("Missing monitor reply object")); - goto cleanup; + if (sync_msg.first) { + VIR_FREE(sync_msg.txBuffer); + memset(&sync_msg, 0, sizeof(sync_msg)); + goto retry; + } else { + virReportError(VIR_ERR_AGENT_UNSYNCED, "%s", + _("Missing monitor reply object")); + goto cleanup; + } } ret = 0;