dovecot-2.0: config: Log a warning if auth service's client_limi...

dovecot at dovecot.org dovecot at dovecot.org
Thu Mar 25 17:03:17 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/4191ba54c8aa
changeset: 10977:4191ba54c8aa
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Mar 25 17:00:48 2010 +0200
description:
config: Log a warning if auth service's client_limit is too low.

diffstat:

 src/master/master-settings.c |  45 +++++++++++++++++++++++++++++++++------------
 1 files changed, 33 insertions(+), 12 deletions(-)

diffs (97 lines):

diff -r f6c2c0866aff -r 4191ba54c8aa src/master/master-settings.c
--- a/src/master/master-settings.c	Tue Mar 23 20:14:56 2010 +0200
+++ b/src/master/master-settings.c	Thu Mar 25 17:00:48 2010 +0200
@@ -334,8 +334,7 @@
 	array_foreach(&set->services, services) {
 		struct service_settings *service = *services;
 
-		if (service->protocol != NULL &&
-		    strcmp(service->protocol, name) == 0)
+		if (strcmp(service->protocol, name) == 0)
 			return TRUE;
 	}
 	return FALSE;
@@ -344,11 +343,13 @@
 static bool
 master_settings_verify(void *_set, pool_t pool, const char **error_r)
 {
+	static int warned_auth = FALSE;
 	struct master_settings *set = _set;
 	struct service_settings *const *services;
 	const char *const *strings;
 	ARRAY_TYPE(const_string) all_listeners;
 	unsigned int i, j, count, process_limit;
+	unsigned int auth_client_limit, max_auth_client_processes;
 
 	if (set->last_valid_uid != 0 &&
 	    set->first_valid_uid > set->last_valid_uid) {
@@ -390,8 +391,18 @@
 		expand_user(&service->user, set);
 		service_set_login_dump_core(service);
 	}
+	set->protocols_split = p_strsplit(pool, set->protocols, " ");
+	for (i = 0; set->protocols_split[i] != NULL; i++) {
+		if (!services_have_protocol(set, set->protocols_split[i])) {
+			*error_r = t_strdup_printf("protocols: "
+						   "Unknown protocol: %s",
+						   set->protocols_split[i]);
+			return FALSE;
+		}
+	}
 
 	t_array_init(&all_listeners, 64);
+	auth_client_limit = max_auth_client_processes = 0;
 	for (i = 0; i < count; i++) {
 		struct service_settings *service = services[i];
 
@@ -426,6 +437,19 @@
 				service->name);
 			return FALSE;
 		}
+
+		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)) {
+			/* 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;
+		}
+
 		fix_file_listener_paths(&service->unix_listeners,
 					pool, set, &all_listeners);
 		fix_file_listener_paths(&service->fifo_listeners,
@@ -433,6 +457,13 @@
 		add_inet_listeners(&service->inet_listeners, &all_listeners);
 	}
 
+	if (auth_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);
+	}
+
 	/* check for duplicate listeners */
 	array_sort(&all_listeners, i_strcmp_p);
 	strings = array_get(&all_listeners, &count);
@@ -443,16 +474,6 @@
 			return FALSE;
 		}
 	}
-
-	set->protocols_split = p_strsplit(pool, set->protocols, " ");
-	for (i = 0; set->protocols_split[i] != NULL; i++) {
-		if (!services_have_protocol(set, set->protocols_split[i])) {
-			*error_r = t_strdup_printf("protocols: "
-						   "Unknown protocol: %s",
-						   set->protocols_split[i]);
-			return FALSE;
-		}
-	}
 	return TRUE;
 }
 /* </settings checks> */


More information about the dovecot-cvs mailing list