# HG changeset patch # User Timo Sirainen # Date 1186482889 -10800 # Node ID 06743e1e4c138e0153efb86ed044bb5dcb2131e4 # Parent 91f9f6fb82768267857a1e4534d38759f6436578 Added auth_worker_max_request_count setting. 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 @@ -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 = 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 @@ 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); 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 @@ 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 @@ 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, /* .. */ 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 @@ unsigned int count; unsigned int worker_max_count; + unsigned int worker_max_request_count; unsigned int process_size; /* .. */