+Thu Dec 4 22:18:41 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
+
+ * qemud/qemud.c: Read number of threads for RPC dispatch
+ from config. Allow a limit on total client connection
+ count.
+ * qemud/libvirtd.conf: Add max_clients and max_workers
+ and min_workers config vars
+ * qemud/libvirtd.aug, qemud/test_libvirtd.aug: Augeas
+ support for new config params
+
Thu Dec 4 22:16:41 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
Make daemon use a thread pool for handling RPC calls
let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""
let bool_val = store /0|1/
+ let int_val = store /[0-9]+/
let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ ""
let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end
let str_entry (kw:string) = [ key kw . value_sep . str_val ]
let bool_entry (kw:string) = [ key kw . value_sep . bool_val ]
+ let int_entry (kw:string) = [ key kw . value_sep . int_val ]
let str_array_entry (kw:string) = [ key kw . value_sep . str_array_val ]
| str_array_entry "tls_allowed_dn_list"
| str_array_entry "sasl_allowed_username_list"
+ let processing_entry = int_entry "min_workers"
+ | int_entry "max_workers"
+ | int_entry "max_clients"
(* Each enty in the config is one of the following three ... *)
let entry = network_entry
| authentication_entry
| certificate_entry
| authorization_entry
+ | processing_entry
let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
let empty = [ label "#empty" . eol ]
#sasl_allowed_username_list = ["joe@EXAMPLE.COM", "fred@EXAMPLE.COM" ]
+
+#################################################################
+#
+# Processing controls
+#
+
+# The maximum number of concurrent client connections to allow
+# over all sockets combined.
+#max_clients = 20
+
+
+# The minimum limit sets the number of workers to start up
+# initially. If the number of active clients exceeds this,
+# then more threads are spawned, upto max_workers limit.
+# Typically you'd want max_workers to equal maximum number
+# of clients allowed
+#min_workers = 5
+#max_workers = 20
+
static gnutls_certificate_credentials_t x509_cred;
static gnutls_dh_params_t dh_params;
+static int min_workers = 5;
+static int max_workers = 20;
+static int max_clients = 20;
+
#define DH_BITS 1024
static sig_atomic_t sig_errors = 0;
return -1;
}
+ if (server->nclients >= max_clients) {
+ qemudLog(QEMUD_ERR, "%s", _("Too many active clients, dropping connection"));
+ close(fd);
+ return -1;
+ }
+
if (VIR_REALLOC_N(server->clients, server->nclients+1) < 0) {
qemudLog(QEMUD_ERR, "%s", _("Out of memory allocating clients"));
close(fd);
pthread_mutex_lock(&server->lock);
- server->nworkers = 10;
+ server->nworkers = min_workers;
if (VIR_ALLOC_N(server->workers, server->nworkers) < 0) {
qemudLog(QEMUD_ERR, "%s", _("Failed to allocate workers"));
return -1;
if (remoteReadSaslAllowedUsernameList (conf, server, filename) < 0)
goto free_and_fail;
+
+ GET_CONF_INT (conf, filename, min_workers);
+ GET_CONF_INT (conf, filename, max_workers);
+ GET_CONF_INT (conf, filename, max_clients);
+
virConfFree (conf);
return 0;
\"joe@EXAMPLE.COM\",
\"fred@EXAMPLE.COM\"
]
+
+
+#################################################################
+#
+# Processing controls
+#
+
+# The maximum number of concurrent client connections to allow
+# over all sockets combined.
+max_clients = 20
+
+
+# The minimum limit sets the number of workers to start up
+# initially. If the number of active clients exceeds this,
+# then more threads are spawned, upto max_workers limit.
+# Typically you'd want max_workers to equal maximum number
+# of clients allowed
+min_workers = 5
+max_workers = 20
"
test Libvirtd.lns get conf =
{ "1" = "joe@EXAMPLE.COM" }
{ "2" = "fred@EXAMPLE.COM" }
}
+ { "#empty" }
+ { "#empty" }
+ { "#comment" = "################################################################"}
+ { "#comment" = ""}
+ { "#comment" = "Processing controls"}
+ { "#comment" = ""}
+ { "#empty" }
+ { "#comment" = "The maximum number of concurrent client connections to allow"}
+ { "#comment" = "over all sockets combined."}
+ { "max_clients" = "20" }
+ { "#empty" }
+ { "#empty" }
+ { "#comment" = "The minimum limit sets the number of workers to start up"}
+ { "#comment" = "initially. If the number of active clients exceeds this,"}
+ { "#comment" = "then more threads are spawned, upto max_workers limit."}
+ { "#comment" = "Typically you'd want max_workers to equal maximum number"}
+ { "#comment" = "of clients allowed"}
+ { "min_workers" = "5" }
+ { "max_workers" = "20" }