Mercurial > dovecot > core-2.2
changeset 12376:97b286b6ec45
master: Log a warning at startup if anvil's client_limit is too low.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 03 Nov 2010 15:31:48 +0000 |
parents | d3d07da70102 |
children | 708fd6faca39 |
files | src/master/master-settings.c |
diffstat | 1 files changed, 38 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/master/master-settings.c Wed Nov 03 15:31:36 2010 +0000 +++ b/src/master/master-settings.c Wed Nov 03 15:31:48 2010 +0000 @@ -369,10 +369,26 @@ } #endif +static unsigned int +service_get_client_limit(struct master_settings *set, const char *name) +{ + struct service_settings *const *servicep; + + array_foreach(&set->services, servicep) { + if (strcmp((*servicep)->name, name) == 0) { + if ((*servicep)->client_limit != 0) + return (*servicep)->client_limit; + else + return set->default_client_limit; + } + } + return set->default_client_limit; +} + static bool master_settings_verify(void *_set, pool_t pool, const char **error_r) { - static int warned_auth = FALSE; + static int warned_auth = FALSE, warned_anvil = FALSE; #ifdef CONFIG_BINARY const struct service_settings *default_service; #endif @@ -380,8 +396,8 @@ struct service_settings *const *services; const char *const *strings; ARRAY_TYPE(const_string) all_listeners; - unsigned int i, j, count, len, process_limit; - unsigned int auth_client_limit, max_auth_client_processes; + unsigned int i, j, count, len, client_limit, process_limit; + unsigned int max_auth_client_processes, max_anvil_client_processes; len = strlen(set->base_dir); if (len > 0 && set->base_dir[len-1] == '/') { @@ -448,7 +464,8 @@ } } t_array_init(&all_listeners, 64); - auth_client_limit = max_auth_client_processes = 0; + max_auth_client_processes = 0; + max_anvil_client_processes = 2; /* blocking, nonblocking pipes */ for (i = 0; i < count; i++) { struct service_settings *service = services[i]; @@ -495,17 +512,16 @@ } #endif - if (strcmp(service->name, "auth") == 0) { - auth_client_limit = service->client_limit != 0 ? - service->client_limit : - set->default_client_limit; - } else if (*service->protocol != '\0' && - str_array_find((const char **)set->protocols_split, - service->protocol)) { + if (*service->protocol != '\0' && + str_array_find((const char **)set->protocols_split, + service->protocol)) { /* each imap/pop3/lmtp process can use up a connection, although if service_count=1 it's only temporary */ max_auth_client_processes += process_limit; } + if (strcmp(service->type, "login") == 0 || + strcmp(service->name, "auth") == 0) + max_anvil_client_processes += process_limit; fix_file_listener_paths(&service->unix_listeners, pool, set, &all_listeners); @@ -514,11 +530,20 @@ add_inet_listeners(&service->inet_listeners, &all_listeners); } - if (auth_client_limit < max_auth_client_processes && !warned_auth) { + client_limit = service_get_client_limit(set, "auth"); + if (client_limit < max_auth_client_processes && !warned_auth) { warned_auth = TRUE; i_warning("service auth { client_limit=%u } is lower than " "required under max. load (%u)", - auth_client_limit, max_auth_client_processes); + client_limit, max_auth_client_processes); + } + + client_limit = service_get_client_limit(set, "anvil"); + if (client_limit < max_anvil_client_processes && !warned_anvil) { + warned_anvil = TRUE; + i_warning("service anvil { client_limit=%u } is lower than " + "required under max. load (%u)", + client_limit, max_anvil_client_processes); } /* check for duplicate listeners */