changeset 6217:06743e1e4c13 HEAD

Added auth_worker_max_request_count setting.
author Timo Sirainen <tss@iki.fi>
date Tue, 07 Aug 2007 13:34:49 +0300
parents 91f9f6fb8276
children 74df0c0743c4
files dovecot-example.conf src/auth/auth-worker-server.c src/master/auth-process.c src/master/master-settings.c src/master/master-settings.h
diffstat 5 files changed, 29 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/dovecot-example.conf	Tue Aug 07 13:20:16 2007 +0300
+++ b/dovecot-example.conf	Tue Aug 07 13:34:49 2007 +0300
@@ -745,6 +745,10 @@
 # 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().
 #auth_gssapi_hostname =
--- 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 @@
 
 	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 @@
 	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 @@
 	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;
 		}
@@ -235,6 +238,12 @@
 		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();
+	}
 }
 
 static struct auth_worker_request *
@@ -277,6 +286,8 @@
 		}
 	}
 
+	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 @@
 	}
 
 	conn->last_used = ioloop_time;
+	conn->requests_left--;
 	if (conn->request_count++ == 0)
 		idle_count--;
 }
@@ -356,6 +368,13 @@
 		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);
--- 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 @@
 				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 */
--- 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 @@
 
 	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 @@
 
 	MEMBER(count) 1,
 	MEMBER(worker_max_count) 30,
+	MEMBER(worker_max_request_count) 0,
 	MEMBER(process_size) 256,
 
 	/* .. */
--- 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 @@
 
 	unsigned int count;
 	unsigned int worker_max_count;
+	unsigned int worker_max_request_count;
 	unsigned int process_size;
 
 	/* .. */