43fe83
From 8f5480fdbf65d53aade99836156fad34f21d3803 Mon Sep 17 00:00:00 2001
43fe83
Message-Id: <8f5480fdbf65d53aade99836156fad34f21d3803.1377873636.git.jdenemar@redhat.com>
43fe83
From: Michal Privoznik <mprivozn@redhat.com>
43fe83
Date: Mon, 5 Aug 2013 11:30:17 +0200
43fe83
Subject: [PATCH] Introduce max_queued_clients
43fe83
43fe83
https://bugzilla.redhat.com/show_bug.cgi?id=981729
43fe83
43fe83
This configuration knob lets user to set the length of queue of
43fe83
connection requests waiting to be accept()-ed by the daemon. IOW, it
43fe83
just controls the @backlog passed to listen:
43fe83
43fe83
  int listen(int sockfd, int backlog);
43fe83
(cherry picked from commit 1199edb1d4e3ebbc691bd32d3519a3b662225420)
43fe83
---
43fe83
 daemon/libvirtd-config.c      | 1 +
43fe83
 daemon/libvirtd-config.h      | 1 +
43fe83
 daemon/libvirtd.aug           | 1 +
43fe83
 daemon/libvirtd.c             | 4 ++++
43fe83
 daemon/libvirtd.conf          | 6 ++++++
43fe83
 src/locking/lock_daemon.c     | 2 +-
43fe83
 src/lxc/lxc_controller.c      | 1 +
43fe83
 src/rpc/virnetserverservice.c | 6 ++++--
43fe83
 src/rpc/virnetserverservice.h | 2 ++
43fe83
 9 files changed, 21 insertions(+), 3 deletions(-)
43fe83
43fe83
diff --git a/daemon/libvirtd-config.c b/daemon/libvirtd-config.c
43fe83
index 107a9cf..c816fda 100644
43fe83
--- a/daemon/libvirtd-config.c
43fe83
+++ b/daemon/libvirtd-config.c
43fe83
@@ -414,6 +414,7 @@ daemonConfigLoadOptions(struct daemonConfig *data,
43fe83
     GET_CONF_INT(conf, filename, min_workers);
43fe83
     GET_CONF_INT(conf, filename, max_workers);
43fe83
     GET_CONF_INT(conf, filename, max_clients);
43fe83
+    GET_CONF_INT(conf, filename, max_queued_clients);
43fe83
 
43fe83
     GET_CONF_INT(conf, filename, prio_workers);
43fe83
 
43fe83
diff --git a/daemon/libvirtd-config.h b/daemon/libvirtd-config.h
43fe83
index 973e0ea..a24d5d2 100644
43fe83
--- a/daemon/libvirtd-config.h
43fe83
+++ b/daemon/libvirtd-config.h
43fe83
@@ -63,6 +63,7 @@ struct daemonConfig {
43fe83
     int min_workers;
43fe83
     int max_workers;
43fe83
     int max_clients;
43fe83
+    int max_queued_clients;
43fe83
 
43fe83
     int prio_workers;
43fe83
 
43fe83
diff --git a/daemon/libvirtd.aug b/daemon/libvirtd.aug
43fe83
index 7c56a41..70fce5c 100644
43fe83
--- a/daemon/libvirtd.aug
43fe83
+++ b/daemon/libvirtd.aug
43fe83
@@ -56,6 +56,7 @@ module Libvirtd =
43fe83
    let processing_entry = int_entry "min_workers"
43fe83
                         | int_entry "max_workers"
43fe83
                         | int_entry "max_clients"
43fe83
+                        | int_entry "max_queued_clients"
43fe83
                         | int_entry "max_requests"
43fe83
                         | int_entry "max_client_requests"
43fe83
                         | int_entry "prio_workers"
43fe83
diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
43fe83
index 9f7fd8a..402b494 100644
43fe83
--- a/daemon/libvirtd.c
43fe83
+++ b/daemon/libvirtd.c
43fe83
@@ -485,6 +485,7 @@ static int daemonSetupNetworking(virNetServerPtr srv,
43fe83
                                            NULL,
43fe83
 #endif
43fe83
                                            false,
43fe83
+                                           config->max_queued_clients,
43fe83
                                            config->max_client_requests)))
43fe83
         goto error;
43fe83
     if (sock_path_ro) {
43fe83
@@ -497,6 +498,7 @@ static int daemonSetupNetworking(virNetServerPtr srv,
43fe83
                                                  NULL,
43fe83
 #endif
43fe83
                                                  true,
43fe83
+                                                 config->max_queued_clients,
43fe83
                                                  config->max_client_requests)))
43fe83
             goto error;
43fe83
     }
43fe83
@@ -522,6 +524,7 @@ static int daemonSetupNetworking(virNetServerPtr srv,
43fe83
                                                      NULL,
43fe83
 #endif
43fe83
                                                      false,
43fe83
+                                                     config->max_queued_clients,
43fe83
                                                      config->max_client_requests)))
43fe83
                 goto error;
43fe83
 
43fe83
@@ -562,6 +565,7 @@ static int daemonSetupNetworking(virNetServerPtr srv,
43fe83
                                             config->auth_tls,
43fe83
                                             ctxt,
43fe83
                                             false,
43fe83
+                                            config->max_queued_clients,
43fe83
                                             config->max_client_requests))) {
43fe83
                 virObjectUnref(ctxt);
43fe83
                 goto error;
43fe83
diff --git a/daemon/libvirtd.conf b/daemon/libvirtd.conf
43fe83
index af4493e..5353927 100644
43fe83
--- a/daemon/libvirtd.conf
43fe83
+++ b/daemon/libvirtd.conf
43fe83
@@ -257,6 +257,12 @@
43fe83
 # over all sockets combined.
43fe83
 #max_clients = 20
43fe83
 
43fe83
+# The maximum length of queue of connections waiting to be
43fe83
+# accepted by the daemon. Note, that some protocols supporting
43fe83
+# retransmission may obey this so that a later reattempt at
43fe83
+# connection succeeds.
43fe83
+#max_queued_clients = 1000
43fe83
+
43fe83
 
43fe83
 # The minimum limit sets the number of workers to start up
43fe83
 # initially. If the number of active clients exceeds this,
43fe83
diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
43fe83
index c4c1727..c45f45c 100644
43fe83
--- a/src/locking/lock_daemon.c
43fe83
+++ b/src/locking/lock_daemon.c
43fe83
@@ -671,7 +671,7 @@ virLockDaemonSetupNetworkingNative(virNetServerPtr srv, const char *sock_path)
43fe83
 #if WITH_GNUTLS
43fe83
                                            NULL,
43fe83
 #endif
43fe83
-                                           false, 1)))
43fe83
+                                           false, 0, 1)))
43fe83
         return -1;
43fe83
 
43fe83
     if (virNetServerAddService(srv, svc, NULL) < 0) {
43fe83
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
43fe83
index 124ab19..ed73ab0 100644
43fe83
--- a/src/lxc/lxc_controller.c
43fe83
+++ b/src/lxc/lxc_controller.c
43fe83
@@ -745,6 +745,7 @@ static int virLXCControllerSetupServer(virLXCControllerPtr ctrl)
43fe83
                                            NULL,
43fe83
 #endif
43fe83
                                            false,
43fe83
+                                           0,
43fe83
                                            5)))
43fe83
         goto error;
43fe83
 
43fe83
diff --git a/src/rpc/virnetserverservice.c b/src/rpc/virnetserverservice.c
43fe83
index 632f03d..4113ec9 100644
43fe83
--- a/src/rpc/virnetserverservice.c
43fe83
+++ b/src/rpc/virnetserverservice.c
43fe83
@@ -97,6 +97,7 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
43fe83
                                                  virNetTLSContextPtr tls,
43fe83
 #endif
43fe83
                                                  bool readonly,
43fe83
+                                                 size_t max_queued_clients,
43fe83
                                                  size_t nrequests_client_max)
43fe83
 {
43fe83
     virNetServerServicePtr svc;
43fe83
@@ -122,7 +123,7 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
43fe83
         goto error;
43fe83
 
43fe83
     for (i = 0; i < svc->nsocks; i++) {
43fe83
-        if (virNetSocketListen(svc->socks[i], 0) < 0)
43fe83
+        if (virNetSocketListen(svc->socks[i], max_queued_clients) < 0)
43fe83
             goto error;
43fe83
 
43fe83
         /* IO callback is initially disabled, until we're ready
43fe83
@@ -155,6 +156,7 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
43fe83
                                                   virNetTLSContextPtr tls,
43fe83
 #endif
43fe83
                                                   bool readonly,
43fe83
+                                                  size_t max_queued_clients,
43fe83
                                                   size_t nrequests_client_max)
43fe83
 {
43fe83
     virNetServerServicePtr svc;
43fe83
@@ -185,7 +187,7 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
43fe83
         goto error;
43fe83
 
43fe83
     for (i = 0; i < svc->nsocks; i++) {
43fe83
-        if (virNetSocketListen(svc->socks[i], 0) < 0)
43fe83
+        if (virNetSocketListen(svc->socks[i], max_queued_clients) < 0)
43fe83
             goto error;
43fe83
 
43fe83
         /* IO callback is initially disabled, until we're ready
43fe83
diff --git a/src/rpc/virnetserverservice.h b/src/rpc/virnetserverservice.h
43fe83
index 1ece503..eb31abf 100644
43fe83
--- a/src/rpc/virnetserverservice.h
43fe83
+++ b/src/rpc/virnetserverservice.h
43fe83
@@ -44,6 +44,7 @@ virNetServerServicePtr virNetServerServiceNewTCP(const char *nodename,
43fe83
                                                  virNetTLSContextPtr tls,
43fe83
 # endif
43fe83
                                                  bool readonly,
43fe83
+                                                 size_t max_queued_clients,
43fe83
                                                  size_t nrequests_client_max);
43fe83
 virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
43fe83
                                                   mode_t mask,
43fe83
@@ -53,6 +54,7 @@ virNetServerServicePtr virNetServerServiceNewUNIX(const char *path,
43fe83
                                                   virNetTLSContextPtr tls,
43fe83
 # endif
43fe83
                                                   bool readonly,
43fe83
+                                                  size_t max_queued_clients,
43fe83
                                                   size_t nrequests_client_max);
43fe83
 virNetServerServicePtr virNetServerServiceNewFD(int fd,
43fe83
                                                 int auth,
43fe83
-- 
43fe83
1.8.3.2
43fe83