On 11.05.2016 12:20, Erik Skultety wrote: > Enable retrieval of the number of maximum clients connected to all sockets > combined as well as the number of maximum clients waiting for authentication, > in order to be successfully connected. These are the attributes configurable > through libvirtd.conf, however, it could be handy to not only know values for > these limits, but also the values for the current number of clients > connected and number of clients currently waiting for authentication which are > changing dynamically. This API does both, retrieves the limits as well as the > current dynamic values. > > Signed-off-by: Erik Skultety <eskultet@xxxxxxxxxx> > --- > daemon/admin.c | 45 +++++++++++++++++++++++++++++++++++++++++ > daemon/admin_server.c | 41 +++++++++++++++++++++++++++++++++++++ > daemon/admin_server.h | 5 +++++ > include/libvirt/libvirt-admin.h | 5 +++++ > src/admin/admin_protocol.x | 19 ++++++++++++++++- > src/admin/admin_remote.c | 39 +++++++++++++++++++++++++++++++++++ > src/admin_protocol-structs | 11 ++++++++++ > src/libvirt-admin.c | 43 +++++++++++++++++++++++++++++++++++++++ > src/libvirt_admin_private.syms | 2 ++ > src/libvirt_admin_public.syms | 1 + > 10 files changed, 210 insertions(+), 1 deletion(-) > > diff --git a/daemon/admin.c b/daemon/admin.c > index 03774d7..819b1c0 100644 > --- a/daemon/admin.c > +++ b/daemon/admin.c > @@ -301,4 +301,49 @@ adminDispatchClientGetInfo(virNetServerPtr server ATTRIBUTE_UNUSED, > virObjectUnref(srv); > return rv; > } > + > +static int > +adminDispatchServerGetClientProcessingControls(virNetServerPtr server ATTRIBUTE_UNUSED, Ugrh. I couldn't say it in one breath. How about virAdminServerGetClientLimits? Yeah, not much shorter. > + virNetServerClientPtr client, > + virNetMessagePtr msg ATTRIBUTE_UNUSED, > + virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED, > + admin_server_get_client_processing_controls_args *args, > + admin_server_get_client_processing_controls_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->srv.name))) > + goto cleanup; > + > + if (adminServerGetClientProcessingControls(srv, ¶ms, &nparams, > + args->flags) < 0) > + goto cleanup; > + > + if (nparams > ADMIN_SERVER_CLIENT_PROCESSING_CONTROLS_MAX) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("Number of client processing parameters %d exceeds " > + "max allowed limit: %d"), nparams, > + ADMIN_SERVER_CLIENT_PROCESSING_CONTROLS_MAX); > + goto cleanup; > + } > + > + if (virTypedParamsSerialize(params, nparams, > + (virTypedParameterRemotePtr *) &ret->params.params_val, > + &ret->params.params_len, 0) < 0) > + goto cleanup; > + > + 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 9f40688..79437a1 100644 > --- a/daemon/admin_server.c > +++ b/daemon/admin_server.c > @@ -311,3 +311,44 @@ int adminClientClose(virNetServerClientPtr client, > virNetServerClientClose(client); > return 0; > } > + > +int > +adminServerGetClientProcessingControls(virNetServerPtr srv, > + virTypedParameterPtr *params, > + int *nparams, > + unsigned int flags) > +{ > + int ret = -1; > + int maxparams = 0; > + virTypedParameterPtr tmpparams = NULL; > + > + virCheckFlags(0, -1); > + > + if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, > + VIR_SERVER_CLIENTS_MAX, > + virNetServerGetMaxClients(srv)) < 0) > + goto cleanup; > + > + if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, > + VIR_SERVER_CLIENTS_CURRENT, > + virNetServerGetCurrentClients(srv)) < 0) > + goto cleanup; > + > + if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, > + VIR_SERVER_CLIENTS_UNAUTH_MAX, > + virNetServerGetMaxUnauthClients(srv)) < 0) > + goto cleanup; > + > + if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, > + VIR_SERVER_CLIENTS_UNAUTH_CURRENT, > + virNetServerGetCurrentUnauthClients(srv)) < 0) > + goto cleanup; Well, all of these are type of size_t in our implementation. Should we make these ULL? > + > + *params = tmpparams; > + tmpparams = NULL; > + ret = 0; > + > + cleanup: > + virTypedParamsFree(tmpparams, *nparams); > + return ret; > +} > diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c > index 9d5e5b9..0b317c5 100644 > --- a/src/libvirt-admin.c > +++ b/src/libvirt-admin.c > @@ -1000,3 +1000,46 @@ int virAdmClientClose(virAdmClientPtr client, > virDispatchError(NULL); > return -1; > } > + > +/** > + * virAdmServerGetClientProcessingControls: > + * @srv: a valid server object reference > + * @params: pointer to client processing controls object > + * (return value, allocated automatically) > + * @nparams: pointer to number of parameters returned in @params > + * @flags: extra flags; not used yet, so callers should always pass 0 > + * > + * Retrieve client processing controls. These include: > + * - current number of clients connected to @srv, > + * - maximum number of clients connected to @srv, > + * - current number of clients connected to @srv waiting for authentication, > + * - maximum number of clients connected to @srv that can be wainting for > + * authentication. > + * > + * Returns 0 on success, allocating @params to size returned in @nparams, or > + * -1 in case of an error. Caller is responsible for deallocating @params. > + */ > +int > +virAdmServerGetClientProcessingControls(virAdmServerPtr srv, > + virTypedParameterPtr *params, > + int *nparams, > + unsigned int flags) > +{ > + int ret = -1; > + > + VIR_DEBUG("srv=%p, flags=%x", srv, flags); > + virResetLastError(); > + > + virCheckAdmServerGoto(srv, error); > + virCheckFlagsGoto(0, error); Drop this check ^^ > + > + if ((ret = remoteAdminServerGetClientProcessingControls(srv, params, > + nparams, > + flags)) < 0) > + goto error; > + > + return ret; > + error: > + virDispatchError(NULL); > + return -1; > +} > diff --git a/src/libvirt_admin_private.syms b/src/libvirt_admin_private.syms > index e55b91e..9a30ff5 100644 > --- a/src/libvirt_admin_private.syms > +++ b/src/libvirt_admin_private.syms > @@ -15,6 +15,8 @@ xdr_admin_connect_list_servers_ret; > xdr_admin_connect_lookup_server_args; > xdr_admin_connect_lookup_server_ret; > xdr_admin_connect_open_args; > +xdr_admin_server_get_client_processing_controls_args; > +xdr_admin_server_get_client_processing_controls_ret; > xdr_admin_server_get_threadpool_parameters_args; > xdr_admin_server_get_threadpool_parameters_ret; > xdr_admin_server_list_clients_args; > diff --git a/src/libvirt_admin_public.syms b/src/libvirt_admin_public.syms > index 57df1f4..59b0160 100644 > --- a/src/libvirt_admin_public.syms > +++ b/src/libvirt_admin_public.syms > @@ -35,4 +35,5 @@ LIBVIRT_ADMIN_1.3.0 { > virAdmServerListClients; > virAdmClientGetInfo; > virAdmClientClose; > + virAdmServerGetClientProcessingControls; > }; > Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list