dovecot-2.2: auth: Don't disconnect auth-worker during long-runn...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Mar 12 12:09:27 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/20a25e17bc3e
changeset: 17158:20a25e17bc3e
user: Timo Sirainen <tss at iki.fi>
date: Wed Mar 12 14:09:14 2014 +0200
description:
auth: Don't disconnect auth-worker during long-running user iterations.
diffstat:
src/auth/auth-worker-server.c | 29 ++++++++++++++++++++++++-----
1 files changed, 24 insertions(+), 5 deletions(-)
diffs (82 lines):
diff -r 9ddb41a2c6c7 -r 20a25e17bc3e src/auth/auth-worker-server.c
--- a/src/auth/auth-worker-server.c Wed Mar 12 12:26:09 2014 +0200
+++ b/src/auth/auth-worker-server.c Wed Mar 12 14:09:14 2014 +0200
@@ -84,6 +84,8 @@
struct const_iovec iov[3];
unsigned int age_secs = ioloop_time - request->created;
+ i_assert(conn->to != NULL);
+
if (age_secs >= AUTH_WORKER_ABORT_SECS) {
i_error("Aborting auth request that was queued for %d secs, "
"%d left in queue",
@@ -236,7 +238,8 @@
io_remove(&conn->io);
i_stream_destroy(&conn->input);
o_stream_destroy(&conn->output);
- timeout_remove(&conn->to);
+ if (conn->to != NULL)
+ timeout_remove(&conn->to);
if (close(conn->fd) < 0)
i_error("close(auth worker) failed: %m");
@@ -266,7 +269,7 @@
return NULL;
}
-static void auth_worker_request_handle(struct auth_worker_connection *conn,
+static bool auth_worker_request_handle(struct auth_worker_connection *conn,
struct auth_worker_request *request,
const char *line)
{
@@ -281,8 +284,12 @@
idle_count++;
}
- if (!request->callback(line, request->context) && conn->io != NULL)
+ if (!request->callback(line, request->context) && conn->io != NULL) {
+ timeout_remove(&conn->to);
io_remove(&conn->io);
+ return FALSE;
+ }
+ return TRUE;
}
static bool auth_worker_error(struct auth_worker_connection *conn)
@@ -376,8 +383,9 @@
continue;
if (conn->request != NULL && id == conn->request->id) {
- auth_worker_request_handle(conn, conn->request,
- line + 1);
+ if (!auth_worker_request_handle(conn, conn->request,
+ line + 1))
+ break;
} else {
if (conn->request != NULL) {
i_error("BUG: Worker sent reply with id %u, "
@@ -401,6 +409,14 @@
auth_worker_request_send_next(conn);
}
+static void worker_input_resume(struct auth_worker_connection *conn)
+{
+ timeout_remove(&conn->to);
+ conn->to = timeout_add(AUTH_WORKER_LOOKUP_TIMEOUT_SECS * 1000,
+ auth_worker_call_timeout, conn);
+ worker_input(conn);
+}
+
struct auth_worker_connection *
auth_worker_call(pool_t pool, const char *username, const char *data,
auth_worker_callback_t *callback, void *context)
@@ -440,6 +456,9 @@
{
if (conn->io == NULL)
conn->io = io_add(conn->fd, IO_READ, worker_input, conn);
+ if (conn->to != NULL)
+ timeout_remove(&conn->to);
+ conn->to = timeout_add_short(0, worker_input_resume, conn);
}
void auth_worker_server_init(void)
More information about the dovecot-cvs
mailing list