The current implementation sets the guest-sync timeout to the
smaller value between the default value (QEMU_AGENT_WAIT_TIME)
and agent->timeout, without considering the timeout passed
via the qga command.
This patch enhances the guest-sync timeout logic to use the
minimum value among the default value, agent->timeout, and
the timeout passed via the qga command.
Resolves:
https://gitlab.com/libvirt/libvirt/-/issues/590
Signed-off-by: ray <honglei.wang(a)smartx.com>
---
src/qemu/qemu_agent.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index f9bcf38dfb..47d735dfa3 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -835,6 +835,7 @@ qemuAgentGuestSyncSend(qemuAgent *agent,
/**
* qemuAgentGuestSync:
* @agent: agent object
+ * @seconds: qemu agent command timeout value
*
* Send guest-sync with unique ID
* and wait for reply. If we get one, check if
@@ -844,9 +845,9 @@ qemuAgentGuestSyncSend(qemuAgent *agent,
* -1 otherwise
*/
static int
-qemuAgentGuestSync(qemuAgent *agent)
+qemuAgentGuestSync(qemuAgent *agent, int seconds)
{
- int timeout = VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT;
+ int timeout = QEMU_AGENT_WAIT_TIME;
int rc;
if (agent->inSync)
@@ -854,9 +855,15 @@ qemuAgentGuestSync(qemuAgent *agent)
/* 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 <
QEMU_AGENT_WAIT_TIME))
+ if ((agent->timeout >= 0) && (agent->timeout < timeout))
timeout = agent->timeout;
+ /* If user specified a timeout parameter smaller than both default
+ * value and agent->timeout in qga APIs(such as qemu-agent-command),
+ * use the parameter timeout value */
+ if ((seconds >= 0) && (seconds < timeout))
+ timeout = seconds;
+
if ((rc = qemuAgentGuestSyncSend(agent, timeout, true)) < 0)
return -1;
@@ -1022,7 +1029,7 @@ qemuAgentCommandFull(qemuAgent *agent,
goto cleanup;
}
- if (qemuAgentGuestSync(agent) < 0)
+ if (qemuAgentGuestSync(agent, seconds) < 0)
goto cleanup;
if (!(cmdstr = virJSONValueToString(cmd, false)))
--
2.43.0