dovecot: Added auth_worker_max_request_count setting.

dovecot at dovecot.org dovecot at dovecot.org
Tue Aug 7 13:46:59 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/06743e1e4c13
changeset: 6217:06743e1e4c13
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Aug 07 13:34:49 2007 +0300
description:
Added auth_worker_max_request_count setting.

diffstat:

5 files changed, 29 insertions(+), 1 deletion(-)
dovecot-example.conf          |    4 ++++
src/auth/auth-worker-server.c |   21 ++++++++++++++++++++-
src/master/auth-process.c     |    2 ++
src/master/master-settings.c  |    2 ++
src/master/master-settings.h  |    1 +

diffs (134 lines):

diff -r 91f9f6fb8276 -r 06743e1e4c13 dovecot-example.conf
--- a/dovecot-example.conf	Tue Aug 07 13:20:16 2007 +0300
+++ b/dovecot-example.conf	Tue Aug 07 13:34:49 2007 +0300
@@ -744,6 +744,10 @@ protocol lda {
 # blocking passdb and userdb queries (eg. MySQL and PAM). They're
 # automatically created and destroyed as needed.
 #auth_worker_max_count = 30
+
+# Number of auth requests to handle before destroying the process. This may
+# be useful if PAM plugins leak memory.
+#auth_worker_max_request_count = 0
 
 # Host name to use in GSSAPI principal names. The default is to use the
 # name returned by gethostname().
diff -r 91f9f6fb8276 -r 06743e1e4c13 src/auth/auth-worker-server.c
--- a/src/auth/auth-worker-server.c	Tue Aug 07 13:20:16 2007 +0300
+++ b/src/auth/auth-worker-server.c	Tue Aug 07 13:34:49 2007 +0300
@@ -34,11 +34,13 @@ struct auth_worker_connection {
 
 	time_t last_used;
 	unsigned int request_count;
+	unsigned int requests_left;
 };
 
 static buffer_t *connections = NULL;
 static unsigned int idle_count;
 static unsigned int auth_workers_max;
+static unsigned int auth_workers_max_request_count;
 
 static char *worker_socket_path;
 static struct timeout *to;
@@ -84,6 +86,7 @@ static struct auth_worker_connection *au
 	conn->output = o_stream_create_fd(fd, (size_t)-1, FALSE);
 	conn->io = io_add(fd, IO_READ, worker_input, conn);
 	conn->requests = buffer_create_dynamic(default_pool, 128);
+	conn->requests_left = auth_workers_max_request_count;
 
 	idle_count++;
 
@@ -175,7 +178,7 @@ static struct auth_worker_connection *au
 	best_size = (size_t)-1;
 	for (i = 0; i < size; i++) {
 		outbuf_size = o_stream_get_buffer_used_size(conn[i]->output);
-		if (outbuf_size < best_size) {
+		if (outbuf_size < best_size && conn[i]->requests_left > 0) {
 			best = conn[i];
 			best_size = outbuf_size;
 		}
@@ -234,6 +237,12 @@ static void worker_input(struct auth_wor
 
 		if (request != NULL)
 			auth_worker_handle_request(conn, request, line + 1);
+	}
+
+	if (conn->requests_left == 0) {
+		auth_worker_destroy(conn);
+		if (idle_count == 0)
+			auth_worker_create();
 	}
 }
 
@@ -277,6 +286,8 @@ void auth_worker_call(struct auth_reques
 		}
 	}
 
+	i_assert(conn->requests_left > 0);
+
 	iov[0].iov_base = t_strdup_printf("%d\t", ++conn->id_counter);
 	iov[0].iov_len = strlen(iov[0].iov_base);
 	iov[1].iov_base = data;
@@ -309,6 +320,7 @@ void auth_worker_call(struct auth_reques
 	}
 
 	conn->last_used = ioloop_time;
+	conn->requests_left--;
 	if (conn->request_count++ == 0)
 		idle_count--;
 }
@@ -356,6 +368,13 @@ void auth_worker_server_init(void)
 		i_fatal("AUTH_WORKER_MAX_COUNT environment not set");
 	auth_workers_max = atoi(env);
 
+	env = getenv("AUTH_WORKER_MAX_REQUEST_COUNT");
+	if (env == NULL)
+		i_fatal("AUTH_WORKER_MAX_REQUEST_COUNT environment not set");
+	auth_workers_max_request_count = atoi(env);
+	if (auth_workers_max_request_count == 0)
+		auth_workers_max_request_count = (unsigned int)-1;
+
 	connections = buffer_create_dynamic(default_pool,
 		sizeof(struct auth_worker_connection) * 16);
 	to = timeout_add(1000 * 60, auth_worker_timeout, NULL);
diff -r 91f9f6fb8276 -r 06743e1e4c13 src/master/auth-process.c
--- a/src/master/auth-process.c	Tue Aug 07 13:20:16 2007 +0300
+++ b/src/master/auth-process.c	Tue Aug 07 13:34:49 2007 +0300
@@ -580,6 +580,8 @@ static int create_auth_process(struct au
 				dec2str(getpid())));
 	env_put(t_strdup_printf("AUTH_WORKER_MAX_COUNT=%u",
 				group->set->worker_max_count));
+	env_put(t_strdup_printf("AUTH_WORKER_MAX_REQUEST_COUNT=%u",
+				group->set->worker_max_request_count));
 
 	/* make sure we don't leak syslog fd, but do it last so that
 	   any errors above will be logged */
diff -r 91f9f6fb8276 -r 06743e1e4c13 src/master/master-settings.c
--- a/src/master/master-settings.c	Tue Aug 07 13:20:16 2007 +0300
+++ b/src/master/master-settings.c	Tue Aug 07 13:34:49 2007 +0300
@@ -89,6 +89,7 @@ static struct setting_def auth_setting_d
 
 	DEF_INT(count),
 	DEF_INT(worker_max_count),
+	DEF_INT(worker_max_request_count),
 	DEF_INT(process_size),
 
 	{ 0, NULL, 0 }
@@ -316,6 +317,7 @@ struct auth_settings default_auth_settin
 
 	MEMBER(count) 1,
 	MEMBER(worker_max_count) 30,
+	MEMBER(worker_max_request_count) 0,
 	MEMBER(process_size) 256,
 
 	/* .. */
diff -r 91f9f6fb8276 -r 06743e1e4c13 src/master/master-settings.h
--- a/src/master/master-settings.h	Tue Aug 07 13:20:16 2007 +0300
+++ b/src/master/master-settings.h	Tue Aug 07 13:34:49 2007 +0300
@@ -213,6 +213,7 @@ struct auth_settings {
 
 	unsigned int count;
 	unsigned int worker_max_count;
+	unsigned int worker_max_request_count;
 	unsigned int process_size;
 
 	/* .. */


More information about the dovecot-cvs mailing list