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