[libvirt] [PATCH v2 08/10] admin: Introduce virAdmServerGethreadPoolParameters

Michal Privoznik mprivozn at redhat.com
Fri Apr 1 15:33:10 UTC 2016


On 29.03.2016 09:51, Erik Skultety wrote:
> New API to retrieve current server workerpool specs. Since it uses typed
> parameters, more specs to retrieve can be further included in the pool of
> supported ones.
> ---
>  daemon/admin.c                  | 59 +++++++++++++++++++++++++++++++++++
>  daemon/admin_server.c           | 69 +++++++++++++++++++++++++++++++++++++++++
>  daemon/admin_server.h           |  6 ++++
>  include/libvirt/libvirt-admin.h |  6 ++++
>  po/POTFILES.in                  |  1 +
>  src/admin/admin_protocol.x      | 20 ++++++++++--
>  src/admin/admin_remote.c        | 43 +++++++++++++++++++++++++
>  src/admin_protocol-structs      | 11 +++++++
>  src/libvirt-admin.c             | 46 +++++++++++++++++++++++++++
>  src/libvirt_admin_private.syms  |  2 ++
>  src/libvirt_admin_public.syms   |  1 +
>  src/rpc/virnetserver.c          | 22 +++++++++++++
>  src/rpc/virnetserver.h          | 13 ++++++++
>  13 files changed, 296 insertions(+), 3 deletions(-)
> 
> diff --git a/daemon/admin.c b/daemon/admin.c
> index 3169cdd..5335cce 100644
> --- a/daemon/admin.c
> +++ b/daemon/admin.c
> @@ -37,6 +37,7 @@
>  #include "virnetserver.h"
>  #include "virstring.h"
>  #include "virthreadjob.h"
> +#include "virtypedparam.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_ADMIN
>  
> @@ -133,4 +134,62 @@ adminConnectGetLibVersion(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
>      return 0;
>  }
>  
> +static int
> +adminDispatchServerGetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
> +                                           virNetServerClientPtr client,
> +                                           virNetMessagePtr msg ATTRIBUTE_UNUSED,
> +                                           virNetMessageErrorPtr rerr,
> +                                           struct admin_server_get_threadpool_parameters_args *args,
> +                                           struct admin_server_get_threadpool_parameters_ret *ret)
> +{
> +    int rv = -1;
> +    virNetServerPtr srv = NULL;
> +    virTypedParameterPtr params = NULL;
> +    int nparams = 0;
> +    struct daemonAdmClientPrivate *priv =
> +        virNetServerClientGetPrivateData(client);
> +
> +    if (!(srv = virNetDaemonGetServer(priv->dmn, args->server.name))) {
> +        virReportError(VIR_ERR_NO_SERVER,
> +                       _("no server with matching name '%s' found"),
> +                       args->server.name);

There's no need for this virReportError(). virnetDaemonGetServer()
already reports an error.

> +        goto cleanup;
> +    }
> +
> +    if (adminDaemonGetThreadPoolParameters(srv, &params, &nparams,
> +                                           args->flags) < 0)
> +        goto cleanup;
> +
> +    if (nparams > ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Number of threadpool parameters %d exceeds max "
> +                         "allowed limit: %d"), nparams,
> +                       ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX);
> +        goto cleanup;
> +    }
> +
> +    if (nparams) {
> +        if (VIR_ALLOC_N(ret->params.params_val, nparams) < 0)
> +            goto cleanup;

This will be leaked as virTypedParamsSerialize() allocates the array yet
again.

> +
> +        ret->params.params_len = nparams;
> +
> +        if (virTypedParamsSerialize(params, nparams,
> +                                    (virTypedParameterRemotePtr *) &ret->params.params_val,
> +                                    &ret->params.params_len, 0) < 0)
> +            goto cleanup;
> +    } else {
> +        ret->params.params_len = 0;
> +        ret->params.params_val = NULL;
> +    }

I think this is not necessary - virTypedParamsSerialize should handle
this case too.

> +
> +    rv = 0;
> + cleanup:
> +    if (rv < 0)
> +        virNetMessageSaveError(rerr);
> +
> +    virTypedParamsFree(params, nparams);
> +    virObjectUnref(srv);
> +    return rv;
> +}
>  #include "admin_dispatch.h"
> diff --git a/daemon/admin_server.c b/daemon/admin_server.c
> index 1d30ea5..00a310b 100644
> --- a/daemon/admin_server.c
> +++ b/daemon/admin_server.c
> @@ -31,6 +31,7 @@
>  #include "virnetdaemon.h"
>  #include "virnetserver.h"
>  #include "virstring.h"
> +#include "virthreadpool.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_ADMIN
>  
> @@ -68,3 +69,71 @@ adminConnectLookupServer(virNetDaemonPtr dmn,
>  
>      return virNetDaemonGetServer(dmn, name);
>  }
> +
> +int
> +adminDaemonGetThreadPoolParameters(virNetServerPtr srv,
> +                                   virTypedParameterPtr *params,
> +                                   int *nparams,
> +                                   unsigned int flags)
> +{
> +    int ret = -1;
> +    int maxparams = 0;
> +    size_t minWorkers;
> +    size_t maxWorkers;
> +    size_t nWorkers;
> +    size_t freeWorkers;
> +    size_t nPrioWorkers;
> +    size_t jobQueueDepth;
> +    virTypedParameterPtr tmpparams = NULL;
> +
> +    virCheckFlags(0, -1);
> +
> +    if (virNetServerGetThreadPoolParameters(srv, &minWorkers, &maxWorkers,
> +                                            &nWorkers, &freeWorkers,
> +                                            &nPrioWorkers,
> +                                            &jobQueueDepth) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("Unable to retrieve threadpool parameters"));
> +        goto cleanup;
> +    }
> +
> +    if (virTypedParamsAddUInt(&tmpparams, nparams,
> +                              &maxparams, VIR_THREADPOOL_WORKERS_MIN,
> +                              minWorkers) < 0)
> +        goto cleanup;
> +
> +    if (virTypedParamsAddUInt(&tmpparams, nparams,
> +                              &maxparams, VIR_THREADPOOL_WORKERS_MAX,
> +                              maxWorkers) < 0)
> +        goto cleanup;
> +
> +    if (virTypedParamsAddUInt(&tmpparams, nparams,
> +                              &maxparams, VIR_THREADPOOL_WORKERS_CURRENT,
> +                              nWorkers) < 0)
> +        goto cleanup;
> +
> +    if (virTypedParamsAddUInt(&tmpparams, nparams,
> +                              &maxparams, VIR_THREADPOOL_WORKERS_FREE,
> +                              freeWorkers) < 0)
> +        goto cleanup;
> +
> +    if (virTypedParamsAddUInt(&tmpparams, nparams,
> +                              &maxparams, VIR_THREADPOOL_WORKERS_PRIORITY,
> +                              nPrioWorkers) < 0)
> +        goto cleanup;
> +
> +    if (virTypedParamsAddUInt(&tmpparams, nparams,
> +                              &maxparams, VIR_THREADPOOL_JOB_QUEUE_DEPTH,
> +                              jobQueueDepth) < 0)
> +        goto cleanup;
> +
> +    *params = tmpparams;
> +    tmpparams = NULL;
> +    ret = 0;
> +
> + cleanup:
> +    if (tmpparams)
> +        virTypedParamsFree(tmpparams, *nparams);

This redundant check is redundant. virTypedParamsFree() is capable of
accepting NULL just fine.

> +
> +    return ret;
> +}

> diff --git a/src/rpc/virnetserver.h b/src/rpc/virnetserver.h
> index aa24440..41c440d 100644
> --- a/src/rpc/virnetserver.h
> +++ b/src/rpc/virnetserver.h
> @@ -89,4 +89,17 @@ int virNetServerStart(virNetServerPtr srv);
>  
>  const char *virNetServerGetName(virNetServerPtr srv);
>  
> +int
> +virNetServerGetThreadPoolParameters(virNetServerPtr srv,
> +                                    size_t *minWorkers,
> +                                    size_t *maxWorkers,
> +                                    size_t *nWorkers,
> +                                    size_t *freeWorkers,
> +                                    size_t *nPrioWorkers,
> +                                    size_t *jobQueueDepth);
> +

> +int virNetServerSetThreadPoolParameters(virNetServerPtr srv,
> +                                        long long int minWorkers,
> +                                        long long int maxWorkers,
> +                                        long long int prioWorkers);

This does not belong here. I'm surprised that compiler does not bother
complaining.

>  #endif /* __VIR_NET_SERVER_H__ */
> 

Michal




More information about the libvir-list mailing list