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