Mercurial > dovecot > original-hg > dovecot-1.2
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, /* .. */