From 0ddfe33c33124b094bf701986c619380363d5f99 Mon Sep 17 00:00:00 2001
Message-Id: <0ddfe33c33124b094bf701986c619380363d5f99@dist-git>
From: Erik Skultety <eskultet@redhat.com>
Date: Tue, 2 Aug 2016 15:20:52 +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 <eskultet@redhat.com>
(cherry picked from commit 5b9f735f16b1d49b11610d40d36ab26e6b48926d)
https://bugzilla.redhat.com/show_bug.cgi?id=1357776
Signed-off-by: Erik Skultety <eskultet@redhat.com>
---
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 0c502d9..c5caef3 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,
--
2.9.2