diff --git a/daemon/libvirtd-config.c b/daemon/libvirtd-config.c index 107a9cf7a6ecc3ef6e5e253746ea1b52e60d405a..c816fda64cf3db9dbcc9ad6f2d28b515a88205e7 100644 --- a/daemon/libvirtd-config.c +++ b/daemon/libvirtd-config.c @@ -414,6 +414,7 @@ daemonConfigLoadOptions(struct daemonConfig *data, GET_CONF_INT(conf, filename, min_workers); GET_CONF_INT(conf, filename, max_workers); GET_CONF_INT(conf, filename, max_clients); + GET_CONF_INT(conf, filename, max_queued_clients); GET_CONF_INT(conf, filename, prio_workers); diff --git a/daemon/libvirtd-config.h b/daemon/libvirtd-config.h index 973e0eab7445d8c9cac4fa41de450b16b817cad1..a24d5d2737f0d9786711456dadd6c51db62679d8 100644 --- a/daemon/libvirtd-config.h +++ b/daemon/libvirtd-config.h @@ -63,6 +63,7 @@ struct daemonConfig { int min_workers; int max_workers; int max_clients; + int max_queued_clients; int prio_workers; diff --git a/daemon/libvirtd.aug b/daemon/libvirtd.aug index 7c56a4111279a942c6151b09de85f466b623e8ae..70fce5c08912829fe3c06c5fadc4800d9e8e1764 100644 --- a/daemon/libvirtd.aug +++ b/daemon/libvirtd.aug @@ -56,6 +56,7 @@ module Libvirtd = let processing_entry = int_entry "min_workers" | int_entry "max_workers" | int_entry "max_clients" + | int_entry "max_queued_clients" | int_entry "max_requests" | int_entry "max_client_requests" | int_entry "prio_workers" diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index 9f7fd8a271296be4f37ad522f790101a176717a6..402b494bce888a13cab3ce31f1f79ae4496d1f48 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -485,6 +485,7 @@ static int daemonSetupNetworking(virNetServerPtr srv, NULL, #endif false, + config->max_queued_clients, config->max_client_requests))) goto error; if (sock_path_ro) { @@ -497,6 +498,7 @@ static int daemonSetupNetworking(virNetServerPtr srv, NULL, #endif true, + config->max_queued_clients, config->max_client_requests))) goto error; } @@ -522,6 +524,7 @@ static int daemonSetupNetworking(virNetServerPtr srv, NULL, #endif false, + config->max_queued_clients, config->max_client_requests))) goto error; @@ -562,6 +565,7 @@ static int daemonSetupNetworking(virNetServerPtr srv, config->auth_tls, ctxt, false, + config->max_queued_clients, config->max_client_requests))) { virObjectUnref(ctxt); goto error; diff --git a/daemon/libvirtd.conf b/daemon/libvirtd.conf index af4493e633e33d5587c381a0887a02a5d89edd46..53539275f55d11c6bcd0c520e3c59b2fb40b77c9 100644 --- a/daemon/libvirtd.conf +++ b/daemon/libvirtd.conf @@ -257,6 +257,12 @@ # over all sockets combined. #max_clients = 20 +# The maximum length of queue of connections waiting to be +# accepted by the daemon. Note, that some protocols supporting +# retransmission may obey this so that a later reattempt at +# connection succeeds. +#max_queued_clients = 1000 + # The minimum limit sets the number of workers to start up # initially. If the number of active clients exceeds this, diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c index c4c1727f35bd1e7edea6de7d993a14550ff819b0..c45f45ce5fb7a674d263ef2b69ac613499a6376e 100644 --- a/src/locking/lock_daemon.c +++ b/src/locking/lock_daemon.c @@ -671,7 +671,7 @@ virLockDaemonSetupNetworkingNative(virNetServerPtr srv, const char *sock_path) #if WITH_GNUTLS NULL, #endif - false, 1))) + false, 0, 1))) return -1; if (virNetServerAddService(srv, svc, NULL) < 0) { diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 124ab192844ccf690e8cfe0a9e7811066c697d45..ed73ab0ac7d778650bb8fe6742f50910293620f3 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -745,6 +745,7 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl) NULL, #endif false, + 0, 5))) goto error; diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c index 632f03d39f26b9828ed84e8f85a86f3ada1bf30b..4113ec988e0d29357e6f61c7c2c64683f945f309 100644 --- a/src/rpc/virnetserverservice.c +++ b/src/rpc/virnetserverservice.c @@ -97,6 +97,7 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename, virNetTLSContextPtr tls, #endif bool readonly, + size_t max_queued_clients, size_t nrequests_client_max) { virNetServerServicePtr svc; @@ -122,7 +123,7 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename, goto error; for (i = 0; i < svc->nsocks; i++) { - if (virNetSocketListen(svc->socks[i], 0) < 0) + if (virNetSocketListen(svc->socks[i], max_queued_clients) < 0) goto error; /* IO callback is initially disabled, until we're ready @@ -155,6 +156,7 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path, virNetTLSContextPtr tls, #endif bool readonly, + size_t max_queued_clients, size_t nrequests_client_max) { virNetServerServicePtr svc; @@ -185,7 +187,7 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path, goto error; for (i = 0; i < svc->nsocks; i++) { - if (virNetSocketListen(svc->socks[i], 0) < 0) + if (virNetSocketListen(svc->socks[i], max_queued_clients) < 0) goto error; /* IO callback is initially disabled, until we're ready diff --git a/src/rpc/virnetserverservice.h b/src/rpc/virnetserverservice.h index 1ece50350b2c12c3273052438fdbeccfe704cac8..eb31abfb0f0d348ef0ea3985d92c450ce1eaa6d2 100644 --- a/src/rpc/virnetserverservice.h +++ b/src/rpc/virnetserverservice.h @@ -44,6 +44,7 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename, virNetTLSContextPtr tls, # endif bool readonly, + size_t max_queued_clients, size_t nrequests_client_max); virNetServerServicePtr virNetServerServiceNewUNIX(const char *path, mode_t mask, @@ -53,6 +54,7 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path, virNetTLSContextPtr tls, # endif bool readonly, + size_t max_queued_clients, size_t nrequests_client_max); virNetServerServicePtr virNetServerServiceNewFD(int fd, int auth,