]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: agent: sync once if qemu has serial port event
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Thu, 5 Mar 2020 14:47:01 +0000 (17:47 +0300)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 12 Mar 2020 17:07:50 +0000 (18:07 +0100)
Sync was introduced in [1] to check for ga presence. This
check is racy but in the era before serial events are available
there was not better solution I guess.

In case we have the events the sync function is different. It allows us
to flush stateless ga channel from remnants of previous communications.
But we need to do it only once. Until we get timeout on issued command
channel state is ok.

[1] qemu_agent: Issue guest-sync prior to every command

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_agent.c
src/qemu/qemu_agent.h
src/qemu/qemu_process.c
tests/qemumonitortestutils.c

index d183b310cb4366e08ab36abf21f74d145deb9dc9..f8f197bfc27627397b02a252c7fae1362877db32 100644 (file)
@@ -108,6 +108,8 @@ struct _qemuAgent {
     GSource *watch;
 
     bool running;
+    bool singleSync;
+    bool inSync;
 
     virDomainObjPtr vm;
 
@@ -673,7 +675,8 @@ qemuAgentPtr
 qemuAgentOpen(virDomainObjPtr vm,
               const virDomainChrSourceDef *config,
               GMainContext *context,
-              qemuAgentCallbacksPtr cb)
+              qemuAgentCallbacksPtr cb,
+              bool singleSync)
 {
     qemuAgentPtr agent;
     g_autoptr(GError) gerr = NULL;
@@ -700,6 +703,7 @@ qemuAgentOpen(virDomainObjPtr vm,
     }
     agent->vm = vm;
     agent->cb = cb;
+    agent->singleSync = singleSync;
 
     if (config->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -853,6 +857,7 @@ static int qemuAgentSend(qemuAgentPtr agent,
                                      _("Unable to wait on agent socket "
                                        "condition"));
             }
+            agent->inSync = false;
             goto cleanup;
         }
     }
@@ -894,6 +899,9 @@ qemuAgentGuestSync(qemuAgentPtr agent)
     qemuAgentMessage sync_msg;
     int timeout = VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT;
 
+    if (agent->singleSync && agent->inSync)
+        return 0;
+
     /* if user specified a custom agent timeout that is lower than the
      * default timeout, use the shorter timeout instead */
     if ((agent->timeout >= 0) && (agent->timeout < timeout))
@@ -939,6 +947,9 @@ qemuAgentGuestSync(qemuAgentPtr agent)
         }
     }
 
+    if (agent->singleSync)
+        agent->inSync = true;
+
     ret = 0;
 
  cleanup:
index d4d861532375de3b311e94b8c10b5a47621ad7d2..67fe9fcde948188f65162b02959fe5ea511a253f 100644 (file)
@@ -42,7 +42,8 @@ struct _qemuAgentCallbacks {
 qemuAgentPtr qemuAgentOpen(virDomainObjPtr vm,
                            const virDomainChrSourceDef *config,
                            GMainContext *context,
-                           qemuAgentCallbacksPtr cb);
+                           qemuAgentCallbacksPtr cb,
+                           bool singleSync);
 
 void qemuAgentClose(qemuAgentPtr mon);
 
index 67dad9841ade22ca70c03e880f69a59767531c10..31cd553afd2f9b5d84419bbc2ad1d3e47b185ded 100644 (file)
@@ -238,7 +238,8 @@ qemuConnectAgent(virQEMUDriverPtr driver, virDomainObjPtr vm)
     agent = qemuAgentOpen(vm,
                           config->source,
                           virEventThreadGetContext(priv->eventThread),
-                          &agentCallbacks);
+                          &agentCallbacks,
+                          virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VSERPORT_CHANGE));
 
     virObjectLock(vm);
 
index 328bfb85253932d47717de0431cbad441a11d904..159b1b909e6478cfe6cf373386588a53c13c67d0 100644 (file)
@@ -1407,7 +1407,8 @@ qemuMonitorTestNewAgent(virDomainXMLOptionPtr xmlopt)
     if (!(test->agent = qemuAgentOpen(test->vm,
                                       &src,
                                       virEventThreadGetContext(test->eventThread),
-                                      &qemuMonitorTestAgentCallbacks)))
+                                      &qemuMonitorTestAgentCallbacks,
+                                      false)))
         goto error;
 
     virObjectLock(test->agent);