* @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);
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,