[libvirt] [PATCH 6/8] qemu: Unify cached caps validity checks

Pavel Hrdina phrdina at redhat.com
Thu Nov 3 15:37:59 UTC 2016


On Wed, Nov 02, 2016 at 10:22:35AM +0100, Jiri Denemark wrote:
> Let's keep all run time validation of cached QEMU capabilities in
> virQEMUCapsIsValid and call it whenever we access the cache.
> virQEMUCapsInitCached should keep only the checks which do not make
> sense once the cache is loaded in memory.
> 
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
>  src/qemu/qemu_capabilities.c | 59 ++++++++++++++++++++++++++++++--------------
>  src/qemu/qemu_capabilities.h |  3 ++-
>  2 files changed, 42 insertions(+), 20 deletions(-)
> 
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 91e8b30..d1c31ad 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -3516,25 +3516,21 @@ virQEMUCapsInitCached(virCapsPtr caps,
>          VIR_WARN("Failed to load cached caps from '%s' for '%s': %s",
>                   capsfile, qemuCaps->binary, virGetLastErrorMessage());
>          virResetLastError();
> -        ret = 0;
> -        virQEMUCapsReset(qemuCaps);
> -        goto cleanup;
> +        goto discard;
>      }
>  
> +    if (!virQEMUCapsIsValid(qemuCaps, qemuctime))
> +        goto discard;
> +
>      /* Discard cache if QEMU binary or libvirtd changed */
> -    if (qemuctime != qemuCaps->ctime ||
> -        selfctime != virGetSelfLastChanged() ||
> +    if (selfctime != virGetSelfLastChanged() ||
>          selfvers != LIBVIR_VERSION_NUMBER) {
> -        VIR_DEBUG("Outdated cached capabilities '%s' for '%s' "
> -                  "(%lld vs %lld, %lld vs %lld, %lu vs %lu)",
> +        VIR_DEBUG("Dropping cached capabilities '%s' for '%s': "
> +                  "libvirt changed (%lld vs %lld, %lu vs %lu)",

Nice cleanup, the only thing that I would change is to split the DEBUG and move
the "Dropping cached capabilities '%s' for '%s'" and put it ...

>                    capsfile, qemuCaps->binary,
> -                  (long long)qemuCaps->ctime, (long long)qemuctime,
>                    (long long)selfctime, (long long)virGetSelfLastChanged(),
>                    selfvers, (unsigned long)LIBVIR_VERSION_NUMBER);
> -        ignore_value(unlink(capsfile));
> -        virQEMUCapsReset(qemuCaps);
> -        ret = 0;
> -        goto cleanup;
> +        goto discard;
>      }
>  
>      VIR_DEBUG("Loaded '%s' for '%s' ctime %lld usedQMP=%d",
> @@ -3548,6 +3544,12 @@ virQEMUCapsInitCached(virCapsPtr caps,
>      VIR_FREE(capsfile);
>      VIR_FREE(capsdir);
>      return ret;
> +
> + discard:

... here where we actually drop the capability.

> +    ignore_value(unlink(capsfile));
> +    virQEMUCapsReset(qemuCaps);
> +    ret = 0;
> +    goto cleanup;
>  }
>  
>  
> @@ -4111,17 +4113,36 @@ virQEMUCapsNewForBinary(virCapsPtr caps,
>  }
>  
>  
> -bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps)
> +bool
> +virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps,
> +                   time_t ctime)
>  {
> -    struct stat sb;
> -
>      if (!qemuCaps->binary)
>          return true;
>  
> -    if (stat(qemuCaps->binary, &sb) < 0)
> -        return false;
> +    if (!ctime) {
> +        struct stat sb;
>  
> -    return sb.st_ctime == qemuCaps->ctime;
> +        if (stat(qemuCaps->binary, &sb) < 0) {
> +            char ebuf[1024];
> +            VIR_DEBUG("Dropping cached capabilities for '%s': "
> +                      "failed to stat QEMU binary: %s",
> +                      qemuCaps->binary,
> +                      virStrerror(errno, ebuf, sizeof(ebuf)));

Same here, remove the "Dropping cached capabilities for '%s': " part and ...

> +            return false;
> +        }
> +        ctime = sb.st_ctime;
> +    }
> +
> +    if (ctime != qemuCaps->ctime) {
> +        VIR_DEBUG("Dropping cached capabilities for '%s': "
> +                  "binary is newer than cache (%lld vs %lld)",
> +                  qemuCaps->binary,
> +                  (long long) ctime, (long long) qemuCaps->ctime);

... same here.  This function doesn't drop the capabilities.

ACK, the suggested change is only for debug logs so I'll leave it up to you,
but it would be cleaner :)

Pavel

> +        return false;
> +    }
> +
> +    return true;
>  }
>  
>  
> @@ -4214,7 +4235,7 @@ virQEMUCapsCacheLookup(virCapsPtr caps,
>      virMutexLock(&cache->lock);
>      ret = virHashLookup(cache->binaries, binary);
>      if (ret &&
> -        !virQEMUCapsIsValid(ret)) {
> +        !virQEMUCapsIsValid(ret, 0)) {
>          VIR_DEBUG("Cached capabilities %p no longer valid for %s",
>                    ret, binary);
>          virHashRemoveEntry(cache->binaries, binary);
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index c77ba13..6c45a67 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -449,7 +449,8 @@ int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
>                                     size_t *nmachines,
>                                     virCapsGuestMachinePtr **machines);
>  
> -bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps);
> +bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps,
> +                        time_t ctime);
>  
>  void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
>                                      const char *machineType);
> -- 
> 2.10.2
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20161103/092896d9/attachment-0001.sig>


More information about the libvir-list mailing list