[libvirt] [PATCH 3/3] qemu: don't retry connect() if doing FD passing

John Ferlan jferlan at redhat.com
Mon Mar 26 13:10:04 UTC 2018



On 03/14/2018 01:33 PM, Daniel P. Berrangé wrote:
> Since libvirt called bind() and listen() on the UNIX socket, it is
> guaranteed that connect() will immediately succeed, if QEMU is running
> normally. It will only fail if QEMU has closed the monitor socket by
> mistake or if QEMU has exited, letting the kernel close it.
> 
> With this in mind we can remove the retry loop and timeout when
> connecting to the QEMU monitor if we are doing FD passing. Libvirt can
> go straight to sending the QMP greeting and will simply block waiting
> for a reply until QEMU is ready.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  src/qemu/qemu_capabilities.c |  2 +-
>  src/qemu/qemu_monitor.c      | 54 ++++++++++++++++++++++++++------------------
>  src/qemu/qemu_monitor.h      |  1 +
>  src/qemu/qemu_process.c      | 27 ++++++++++++++++------
>  tests/qemumonitortestutils.c |  1 +
>  5 files changed, 55 insertions(+), 30 deletions(-)
> 

So just doing the monitor for now... Eventually the agent too?

How about having a news.xml patch - is this a newsworthy change?


[...]

> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 57c06c7c15..9950461810 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1771,7 +1771,7 @@ qemuProcessInitMonitor(virQEMUDriverPtr driver,
>  
>  static int
>  qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob,
> -                   qemuDomainLogContextPtr logCtxt)
> +                   bool retry, qemuDomainLogContextPtr logCtxt)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
>      qemuMonitorPtr mon = NULL;
> @@ -1799,6 +1799,7 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob,
>      mon = qemuMonitorOpen(vm,
>                            priv->monConfig,
>                            priv->monJSON,
> +                          retry,
>                            timeout,
>                            &monitorCallbacks,
>                            driver);
> @@ -2174,17 +2175,23 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
>  {
>      int ret = -1;
>      virHashTablePtr info = NULL;
> -    qemuDomainObjPrivatePtr priv;
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    bool retry = true;

This is also called from qemuProcessAttach where it wouldn't seem
there'd be necessarily be a chardev on the command line with the
pre-opened fd, but then again since it's being used for an already
running qemu instance, that would "I hope" work properly...

With that assumption in place,

Reviewed-by: John Ferlan <jferlan at redhat.com>

John

> +
> +    if (priv->qemuCaps &&
> +        virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS))
> +        retry = false;
>  
> -    VIR_DEBUG("Connect monitor to %p '%s'", vm, vm->def->name);
> -    if (qemuConnectMonitor(driver, vm, asyncJob, logCtxt) < 0)
> +    VIR_DEBUG("Connect monitor to vm=%p name='%s' retry=%d",
> +              vm, vm->def->name, retry);
> +
> +    if (qemuConnectMonitor(driver, vm, asyncJob, retry, logCtxt) < 0)
>          goto cleanup;
>  
>      /* Try to get the pty path mappings again via the monitor. This is much more
>       * reliable if it's available.
>       * Note that the monitor itself can be on a pty, so we still need to try the
>       * log output method. */
> -    priv = vm->privateData;
>      if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
>          goto cleanup;
>      ret = qemuMonitorGetChardevInfo(priv->mon, &info);

[...]




More information about the libvir-list mailing list