[libvirt] [PATCH 1/6] lxc: Introduce method lxcConnectGetAllDomainStats().

Peter Krempa pkrempa at redhat.com
Tue Mar 12 11:13:24 UTC 2019


On Mon, Mar 11, 2019 at 17:56:13 -0300, Julio Faracco wrote:
> This is an implementation of method used by driver to retrieve stats
> from all domain. Right now, this is a simple implementation considering
> only State, CPU, Disks and Balloon.
> 
> Signed-off-by: Julio Faracco <jcfaracco at gmail.com>
> ---
>  src/lxc/lxc_driver.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 83 insertions(+)
> 
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index 760f9f8bdf..1ab6179572 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -5277,6 +5277,88 @@ lxcDomainGetMetadata(virDomainPtr dom,
>      return ret;
>  }
>  
> +static int
> +lxcConnectGetAllDomainStats(virConnectPtr conn,
> +                            virDomainPtr *doms,
> +                            unsigned int ndoms,
> +                            unsigned int stats,
> +                            virDomainStatsRecordPtr **retStats,
> +                            unsigned int flags)
> +{
> +    virLXCDriverPtr driver = conn->privateData;
> +    virDomainObjPtr *vms = NULL;
> +    virDomainObjPtr vm;
> +    size_t nvms;
> +    virDomainStatsRecordPtr *tmpstats = NULL;
> +    int nstats = 0;
> +    size_t i;
> +    int ret = -1;
> +    unsigned int lflags = flags & (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
> +                                   VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
> +                                   VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE);

Flags should not be silently ignored. You need to use virCheckFlags and
reject unsupported ones.

> +    unsigned int supported = VIR_DOMAIN_STATS_STATE |
> +                             VIR_DOMAIN_STATS_CPU_TOTAL |
> +                             VIR_DOMAIN_STATS_BLOCK |
> +                             VIR_DOMAIN_STATS_BALLOON;
> +
> +    virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
> +                  VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
> +                  VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE |
> +                  VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS, -1);
> +
> +    if (virConnectGetAllDomainStatsEnsureACL(conn) < 0)
> +        return -1;
> +
> +    if (!stats) {
> +        stats = supported;
> +    } else if ((flags & VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS) &&
> +               (stats & ~supported)) {
> +        virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
> +                       _("Stats types bits 0x%x are not supported by this daemon"),
> +                       stats & ~supported);
> +        return -1;
> +    }
> +
> +    if (ndoms) {
> +        if (virDomainObjListConvert(driver->domains, conn, doms, ndoms, &vms,
> +                                    &nvms, virConnectGetAllDomainStatsCheckACL,
> +                                    lflags, true) < 0)
> +            return -1;
> +    } else {
> +        if (virDomainObjListCollect(driver->domains, conn, &vms, &nvms,
> +                                    virConnectGetAllDomainStatsCheckACL,
> +                                    lflags) < 0)
> +            return -1;
> +    }
> +
> +    if (VIR_ALLOC_N(tmpstats, ndoms + 1) < 0)
> +        goto cleanup;
> +
> +    for (i = 0; i < nvms; i++) {
> +        virDomainStatsRecordPtr tmp;
> +        vm = vms[i];
> +
> +        virObjectLock(vm);
> +        tmp = lxcDomainGetStats(conn, vm);
> +        virObjectUnlock(vm);
> +
> +        if (!tmp)
> +            goto cleanup;
> +
> +        tmpstats[nstats++] = tmp;
> +
> +    }
> +
> +    *retStats = tmpstats;
> +    tmpstats = NULL;

VIR_STEAL_PTR(*retStats, tmpstats);

> +    ret = nstats;
> +
> + cleanup:
> +    virDomainStatsRecordListFree(tmpstats);
> +    virObjectListFreeCount(vms, nvms);
> +
> +    return ret;
> +}
>  
>  static int
>  lxcDomainGetCPUStats(virDomainPtr dom,
> @@ -5448,6 +5530,7 @@ static virHypervisorDriver lxcHypervisorDriver = {
>      .domainMemoryStats = lxcDomainMemoryStats, /* 1.2.2 */
>      .nodeGetCPUStats = lxcNodeGetCPUStats, /* 0.9.3 */
>      .nodeGetMemoryStats = lxcNodeGetMemoryStats, /* 0.9.3 */
> +    .connectGetAllDomainStats = lxcConnectGetAllDomainStats, /* 5.1.0 */

5.2.0

>      .nodeGetCellsFreeMemory = lxcNodeGetCellsFreeMemory, /* 0.6.5 */
>      .nodeGetFreeMemory = lxcNodeGetFreeMemory, /* 0.6.5 */
>      .nodeGetCPUMap = lxcNodeGetCPUMap, /* 1.0.0 */
> -- 
> 2.19.1
> 
> --
> 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: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190312/bd132052/attachment-0001.sig>


More information about the libvir-list mailing list