summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorErik Skultety <eskultet@redhat.com>2016-04-04 10:28:22 +0200
committerErik Skultety <eskultet@redhat.com>2016-05-19 12:31:53 +0200
commit509bd5d8b3db4a29baa679bc2d013b7037f84799 (patch)
treeb315256a121ff6c4e2ea129f6e1936764885a7ca /src
parent02f674e6101a3c17c463b7f71e6497e8d5c11020 (diff)
downloadlibvirt-509bd5d8b3db4a29baa679bc2d013b7037f84799.tar.gz
admin: Introduce virAdmServerGetClientLimits
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@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/admin/admin_protocol.x19
-rw-r--r--src/admin/admin_remote.c39
-rw-r--r--src/admin_protocol-structs11
-rw-r--r--src/libvirt-admin.c41
-rw-r--r--src/libvirt_admin_private.syms2
-rw-r--r--src/libvirt_admin_public.syms1
6 files changed, 112 insertions, 1 deletions
diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
index 1da7f901ff..53867e3678 100644
--- a/src/admin/admin_protocol.x
+++ b/src/admin/admin_protocol.x
@@ -45,6 +45,9 @@ const ADMIN_CLIENT_LIST_MAX = 16384;
/* Upper limit on number of client info parameters */
const ADMIN_CLIENT_INFO_PARAMETERS_MAX = 64;
+/* Upper limit on number of client processing controls */
+const ADMIN_SERVER_CLIENT_LIMITS_MAX = 32;
+
/* A long string, which may NOT be NULL. */
typedef string admin_nonnull_string<ADMIN_STRING_MAX>;
@@ -165,6 +168,15 @@ struct admin_client_close_args {
unsigned int flags;
};
+struct admin_server_get_client_limits_args {
+ admin_nonnull_server srv;
+ unsigned int flags;
+};
+
+struct admin_server_get_client_limits_ret {
+ admin_typed_param params<ADMIN_SERVER_CLIENT_LIMITS_MAX>;
+};
+
/* Define the program number, protocol version and procedure numbers here. */
const ADMIN_PROGRAM = 0x06900690;
const ADMIN_PROTOCOL_VERSION = 1;
@@ -240,5 +252,10 @@ enum admin_procedure {
/**
* @generate: both
*/
- ADMIN_PROC_CLIENT_CLOSE = 11
+ ADMIN_PROC_CLIENT_CLOSE = 11,
+
+ /**
+ * @generate: none
+ */
+ ADMIN_PROC_SERVER_GET_CLIENT_LIMITS = 12
};
diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c
index 632aaa86fb..1a002af1f5 100644
--- a/src/admin/admin_remote.c
+++ b/src/admin/admin_remote.c
@@ -355,3 +355,42 @@ remoteAdminClientGetInfo(virAdmClientPtr client,
virObjectUnlock(priv);
return rv;
}
+
+static int
+remoteAdminServerGetClientLimits(virAdmServerPtr srv,
+ virTypedParameterPtr *params,
+ int *nparams,
+ unsigned int flags)
+{
+ int rv = -1;
+ admin_server_get_client_limits_args args;
+ admin_server_get_client_limits_ret ret;
+ remoteAdminPrivPtr priv = srv->conn->privateData;
+ args.flags = flags;
+ make_nonnull_server(&args.srv, srv);
+
+ memset(&ret, 0, sizeof(ret));
+ virObjectLock(priv);
+
+ if (call(srv->conn, 0, ADMIN_PROC_SERVER_GET_CLIENT_LIMITS,
+ (xdrproc_t) xdr_admin_server_get_client_limits_args,
+ (char *) &args,
+ (xdrproc_t) xdr_admin_server_get_client_limits_ret,
+ (char *) &ret) == -1)
+ goto cleanup;
+
+ if (virTypedParamsDeserialize((virTypedParameterRemotePtr) ret.params.params_val,
+ ret.params.params_len,
+ ADMIN_SERVER_CLIENT_LIMITS_MAX,
+ params,
+ nparams) < 0)
+ goto cleanup;
+
+ rv = 0;
+ xdr_free((xdrproc_t) xdr_admin_server_get_client_limits_ret,
+ (char *) &ret);
+
+ cleanup:
+ virObjectUnlock(priv);
+ return rv;
+}
diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs
index b4db415bda..03b25ae8d1 100644
--- a/src/admin_protocol-structs
+++ b/src/admin_protocol-structs
@@ -109,6 +109,16 @@ struct admin_client_close_args {
admin_nonnull_client clnt;
u_int flags;
};
+struct admin_server_get_client_limits_args {
+ admin_nonnull_server srv;
+ u_int flags;
+};
+struct admin_server_get_client_limits_ret {
+ struct {
+ u_int params_len;
+ admin_typed_param * params_val;
+ } params;
+};
enum admin_procedure {
ADMIN_PROC_CONNECT_OPEN = 1,
ADMIN_PROC_CONNECT_CLOSE = 2,
@@ -121,4 +131,5 @@ enum admin_procedure {
ADMIN_PROC_SERVER_LOOKUP_CLIENT = 9,
ADMIN_PROC_CLIENT_GET_INFO = 10,
ADMIN_PROC_CLIENT_CLOSE = 11,
+ ADMIN_PROC_SERVER_GET_CLIENT_LIMITS = 12,
};
diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c
index 9d5e5b99ff..07dc883e11 100644
--- a/src/libvirt-admin.c
+++ b/src/libvirt-admin.c
@@ -1000,3 +1000,44 @@ int virAdmClientClose(virAdmClientPtr client,
virDispatchError(NULL);
return -1;
}
+
+/**
+ * virAdmServerGetClientLimits:
+ * @srv: a valid server object reference
+ * @params: pointer to client limits 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 limits from server @srv. 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
+virAdmServerGetClientLimits(virAdmServerPtr srv,
+ virTypedParameterPtr *params,
+ int *nparams,
+ unsigned int flags)
+{
+ int ret = -1;
+
+ VIR_DEBUG("srv=%p, flags=%x", srv, flags);
+ virResetLastError();
+
+ virCheckAdmServerGoto(srv, error);
+
+ if ((ret = remoteAdminServerGetClientLimits(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 e55b91eafd..0c38844581 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_limits_args;
+xdr_admin_server_get_client_limits_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 57df1f436b..707e084f0d 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;
+ virAdmServerGetClientLimits;
};