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

src/qemu/qemu_agent.c

index 18cc473ad4f717f4176d69c8ac9ebd04c002b436..16aa629e553c3c72751926855aeaed9bb1271fc7 100644 (file)
@@ -81,6 +81,8 @@ struct _qemuAgentMessage {
      * fatal error occurred on the monitor channel
      */
     bool finished;
+    /* true for sync command */
+    bool sync;
 };
 
 
@@ -311,8 +313,16 @@ qemuAgentIOProcessLine(qemuAgentPtr mon,
 
     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;
+    }
 
     if (obj->type != VIR_JSON_TYPE_OBJECT) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -939,6 +949,7 @@ qemuAgentGuestSync(qemuAgentPtr mon)
         return -1;
 
     sync_msg.txLength = strlen(sync_msg.txBuffer);
+    sync_msg.sync = true;
 
     VIR_DEBUG("Sending guest-sync command with ID: %llu", id);