From 5b9f735f16b1d49b11610d40d36ab26e6b48926d Mon Sep 17 00:00:00 2001 From: Erik Skultety Date: Wed, 20 Jul 2016 10:36:06 +0200 Subject: [PATCH] rpc: virnetserver: Add code to CheckLimits to handle suspending of services So far, virNetServerCheckLimits was only used to possibly re-enable accepting new clients that might have previously been disabled due to client limits violation (max_clients, max_anonymous_clients). This patch refactors virNetServerAddClient, which is currently the only place where the services get disabled, in order to use the virNetServerCheckLimits helper instead of checking the limits by itself. Signed-off-by: Erik Skultety --- src/rpc/virnetserver.c | 45 +++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 0c502d9557..c5caef3d70 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -239,24 +239,35 @@ static int virNetServerDispatchNewMessage(virNetServerClientPtr client, * @srv: server to check limits on * * Check if limits like max_clients or max_anonymous_clients - * are satisfied and if so, re-enable accepting new clients. + * are satisfied. If so, re-enable accepting new clients. If these are violated + * however, temporarily disable accepting new clients. * The @srv must be locked when this function is called. */ static void virNetServerCheckLimits(virNetServerPtr srv) { - /* Enable services if we can accept a new client. - * The new client can be accepted if both max_clients and - * max_anonymous_clients wouldn't get overcommitted by - * accepting it. */ - VIR_DEBUG("Considering re-enabling services: " - "nclients=%zu nclients_max=%zu " + VIR_DEBUG("Checking client-related limits to re-enable or temporarily " + "suspend services: nclients=%zu nclients_max=%zu " "nclients_unauth=%zu nclients_unauth_max=%zu", srv->nclients, srv->nclients_max, srv->nclients_unauth, srv->nclients_unauth_max); - if (srv->nclients < srv->nclients_max && - (!srv->nclients_unauth_max || - srv->nclients_unauth < srv->nclients_unauth_max)) { + + /* Check the max_anonymous_clients and max_clients limits so that we can + * decide whether the services should be temporarily suspended, thus not + * accepting any more clients for a while or re-enabling the previously + * suspended services in order to accept new clients again. + * A new client can only be accepted if both max_clients and + * max_anonymous_clients wouldn't get overcommitted by accepting it. + */ + if (srv->nclients >= srv->nclients_max || + (srv->nclients_unauth_max && + srv->nclients_unauth >= srv->nclients_unauth_max)) { + /* Temporarily stop accepting new clients */ + VIR_INFO("Temporarily suspending services"); + virNetServerUpdateServicesLocked(srv, false); + } else if (srv->nclients < srv->nclients_max && + (!srv->nclients_unauth_max || + srv->nclients_unauth < srv->nclients_unauth_max)) { /* Now it makes sense to accept() a new client. */ VIR_INFO("Re-enabling services"); virNetServerUpdateServicesLocked(srv, true); @@ -286,19 +297,7 @@ int virNetServerAddClient(virNetServerPtr srv, if (virNetServerClientNeedAuth(client)) virNetServerTrackPendingAuthLocked(srv); - if (srv->nclients_unauth_max && - srv->nclients_unauth == srv->nclients_unauth_max) { - /* Temporarily stop accepting new clients */ - VIR_INFO("Temporarily suspending services " - "due to max_anonymous_clients"); - virNetServerUpdateServicesLocked(srv, false); - } - - if (srv->nclients == srv->nclients_max) { - /* Temporarily stop accepting new clients */ - VIR_INFO("Temporarily suspending services due to max_clients"); - virNetServerUpdateServicesLocked(srv, false); - } + virNetServerCheckLimits(srv); virNetServerClientSetDispatcher(client, virNetServerDispatchNewMessage, -- GitLab