]> xenbits.xensource.com Git - libvirt.git/commitdiff
rpc: virnetserver: Add code to CheckLimits to handle suspending of services
authorErik Skultety <eskultet@redhat.com>
Wed, 20 Jul 2016 08:36:06 +0000 (10:36 +0200)
committerErik Skultety <eskultet@redhat.com>
Tue, 2 Aug 2016 12:51:13 +0000 (14:51 +0200)
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>
src/rpc/virnetserver.c

index 0c502d95572572f35096de7d8167e3810ffd5961..c5caef3d703f4f6e84b6d8dee8d3bb408384737d 100644 (file)
@@ -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,