[libvirt] [PATCH 1/5] vz: provide block stats for all domain stats

Maxim Nestratov mnestratov at virtuozzo.com
Mon Jan 30 16:11:12 UTC 2017


12-Dec-16 10:56, Nikolay Shirokovskiy пишет:

> ---
>   src/vz/vz_driver.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>   src/vz/vz_sdk.c    |   8 +++
>   2 files changed, 197 insertions(+)
>
> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
> index 08f7961..6d173ef 100644
> --- a/src/vz/vz_driver.c
> +++ b/src/vz/vz_driver.c
> @@ -3508,6 +3508,194 @@ vzDomainGetJobStats(virDomainPtr domain,
>       return ret;
>   }
>   
> +#define VZ_ADD_STAT_PARAM_UUL(group, field, counter)            \
> +do {                                                            \
> +    if (stat.field != -1) {                                     \
> +        snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,      \
> +                 group ".%zu." counter, i);                     \
> +        if (virTypedParamsAddULLong(&record->params,            \
> +                                    &record->nparams,           \
> +                                    maxparams,                  \
> +                                    param_name,                 \
> +                                    stat.field) < 0)            \
> +            return -1;                                          \
> +    }                                                           \
> +} while (0)
> +
> +static int
> +vzDomainGetBlockStats(virDomainObjPtr dom,
> +                      virDomainStatsRecordPtr record,
> +                      int *maxparams)
> +{
> +    vzDomObjPtr privdom = dom->privateData;
> +    size_t i;
> +    char param_name[VIR_TYPED_PARAM_FIELD_LENGTH];
> +
> +    if (virTypedParamsAddUInt(&record->params,
> +                              &record->nparams,
> +                              maxparams,
> +                              "block.count",
> +                              dom->def->ndisks) < 0)
> +        return -1;
> +
> +    for (i = 0; i < dom->def->ndisks; i++) {
> +        virDomainBlockStatsStruct stat;
> +        virDomainDiskDefPtr disk = dom->def->disks[i];
> +
> +        if (prlsdkGetBlockStats(privdom->stats, disk, &stat) < 0)
> +            return -1;

This needs to be adapted to the latest HEAD as this function got additional parameter. I can do this while pushing.

> +
> +        snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
> +                 "block.%zu.name", i);
> +        if (virTypedParamsAddString(&record->params,
> +                                    &record->nparams,
> +                                    maxparams,
> +                                    param_name,
> +                                    disk->dst) < 0)
> +            return -1;
> +
> +        if (virStorageSourceIsLocalStorage(disk->src) && disk->src->path) {
> +            snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
> +                     "block.%zu.path", i);
> +            if (virTypedParamsAddString(&record->params,
> +                                        &record->nparams,
> +                                        maxparams,
> +                                        param_name,
> +                                        disk->src->path) < 0)
> +                return -1;
> +        }
> +
> +        VZ_ADD_STAT_PARAM_UUL("block", rd_req, "rd.reqs");
> +        VZ_ADD_STAT_PARAM_UUL("block", rd_bytes, "rd.bytes");
> +        VZ_ADD_STAT_PARAM_UUL("block", wr_req, "wr.reqs");
> +        VZ_ADD_STAT_PARAM_UUL("block", wr_bytes, "wr.bytes");
> +
> +        if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> +            snprintf(param_name, VIR_TYPED_PARAM_FIELD_LENGTH,
> +                     "block.%zu.capacity", i);
> +            if (virTypedParamsAddULLong(&record->params,
> +                                        &record->nparams,
> +                                        maxparams,
> +                                        param_name,
> +                                        disk->src->capacity) < 0)
> +                return -1;
> +        }
> +
> +    }
> +
> +    return 0;
> +}
> +
> +static virDomainStatsRecordPtr
> +vzDomainGetAllStats(virConnectPtr conn,
> +                    virDomainObjPtr dom)
> +{
> +    virDomainStatsRecordPtr stat;
> +    int maxparams = 0;
> +
> +    if (VIR_ALLOC(stat) < 0)
> +        return NULL;
> +
> +    if (vzDomainGetBlockStats(dom, stat, &maxparams) < 0)
> +        goto error;
> +
> +    if (!(stat->dom = virGetDomain(conn, dom->def->name, dom->def->uuid)))
> +        goto error;
> +
> +    return stat;
> +
> + error:
> +    virTypedParamsFree(stat->params, stat->nparams);
> +    virObjectUnref(stat->dom);
> +    VIR_FREE(stat);
> +    return NULL;
> +}
> +
> +static int
> +vzConnectGetAllDomainStats(virConnectPtr conn,
> +                           virDomainPtr *domains,
> +                           unsigned int ndomains,
> +                           unsigned int stats,
> +                           virDomainStatsRecordPtr **retStats,
> +                           unsigned int flags)
> +{
> +    vzConnPtr privconn = conn->privateData;
> +    vzDriverPtr driver = privconn->driver;
> +    unsigned int lflags = flags & (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
> +                                   VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
> +                                   VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE);
> +    unsigned int supported = VIR_DOMAIN_STATS_STATE |
> +                             VIR_DOMAIN_STATS_VCPU |
> +                             VIR_DOMAIN_STATS_INTERFACE |
> +                             VIR_DOMAIN_STATS_BALLOON |
> +                             VIR_DOMAIN_STATS_BLOCK;
> +    virDomainObjPtr *doms = NULL;
> +    size_t ndoms;
> +    virDomainStatsRecordPtr *tmpstats = NULL;
> +    int nstats = 0;
> +    int ret = -1;
> +    size_t i;
> +
> +    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 (ndomains) {
> +        if (virDomainObjListConvert(driver->domains, conn, domains, ndomains, &doms,
> +                                    &ndoms, virConnectGetAllDomainStatsCheckACL,
> +                                    lflags, true) < 0)
> +            return -1;
> +    } else {
> +        if (virDomainObjListCollect(driver->domains, conn, &doms, &ndoms,
> +                                    virConnectGetAllDomainStatsCheckACL,
> +                                    lflags) < 0)
> +            return -1;
> +    }
> +
> +    if (VIR_ALLOC_N(tmpstats, ndoms + 1) < 0)
> +        goto cleanup;
> +
> +    for (i = 0; i < ndoms; i++) {
> +        virDomainStatsRecordPtr tmp;
> +        virDomainObjPtr dom = doms[i];
> +
> +        virObjectLock(dom);
> +        tmp = vzDomainGetAllStats(conn, dom);
> +        virObjectUnlock(dom);
> +
> +        if (!tmp)
> +            goto cleanup;
> +
> +        tmpstats[nstats++] = tmp;
> +    }
> +
> +    *retStats = tmpstats;
> +    tmpstats = NULL;
> +    ret = nstats;
> +
> + cleanup:
> +    virDomainStatsRecordListFree(tmpstats);
> +    virObjectListFreeCount(doms, ndoms);
> +
> +    return ret;
> +}
> +
> +#undef VZ_ADD_STAT_PARAM_UUL
> +
>   static virHypervisorDriver vzHypervisorDriver = {
>       .name = "vz",
>       .connectOpen = vzConnectOpen,            /* 0.10.0 */
> @@ -3603,6 +3791,7 @@ static virHypervisorDriver vzHypervisorDriver = {
>       .domainUpdateDeviceFlags = vzDomainUpdateDeviceFlags, /* 2.0.0 */
>       .domainGetJobInfo = vzDomainGetJobInfo, /* 2.2.0 */
>       .domainGetJobStats = vzDomainGetJobStats, /* 2.2.0 */
> +    .connectGetAllDomainStats = vzConnectGetAllDomainStats, /* 3.0.0 */
>   };

This will be updated too.

>   
>   static virConnectDriver vzConnectDriver = {
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index d13c86a..9566daf 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -592,6 +592,7 @@ prlsdkGetDiskInfo(vzDriverPtr driver,
>       char *buf = NULL;
>       PRL_RESULT pret;
>       PRL_UINT32 emulatedType;
> +    PRL_UINT32 size;
>       virDomainDeviceDriveAddressPtr address;
>       int busIdx, devIdx;
>       int ret = -1;
> @@ -650,6 +651,13 @@ prlsdkGetDiskInfo(vzDriverPtr driver,
>       if (virDomainDiskSetDriver(disk, "vz") < 0)
>           goto cleanup;
>   
> +    if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> +        pret = PrlVmDevHd_GetDiskSize(prldisk, &size);
> +        prlsdkCheckRetGoto(pret, cleanup);
> +        /* from MiB to bytes */
> +        disk->src->capacity = ((unsigned long long)size) << 20;
> +    }
> +
>       ret = 0;
>   
>    cleanup:

ACK




More information about the libvir-list mailing list