]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: agent: reissue sync on garbage sync reply
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Fri, 16 Sep 2016 10:35:35 +0000 (13:35 +0300)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 20 Sep 2016 14:27:58 +0000 (16:27 +0200)
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

index a8560124508eac25dd681869cd383da9bb28ef38..f3d54f6bacd4de771eff188a3197e3a3985a3389 100644 (file)
@@ -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;