render / rpms / libvirt

Forked from rpms/libvirt 9 months ago
Clone
Blob Blame History Raw
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