diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 0c502d95572572f35096de7d8167e3810ffd5961..c5caef3d703f4f6e84b6d8dee8d3bb408384737d 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,