dovecot-2.0: auth: Don't loop through active requests every 5 se...

dovecot at dovecot.org dovecot at dovecot.org
Fri Feb 19 04:20:33 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/d3697efd18f3
changeset: 10757:d3697efd18f3
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Feb 19 04:20:25 2010 +0200
description:
auth: Don't loop through active requests every 5 seconds, looking for timeouts.

diffstat:

 src/auth/auth-client-connection.c |  19 -------------------
 src/auth/auth-request-handler.c   |  27 +++++++++++----------------
 src/auth/auth-request-handler.h   |   2 --
 src/auth/auth-request.c           |  16 +++++++++++++---
 src/auth/auth-request.h           |   5 ++++-
 5 files changed, 28 insertions(+), 41 deletions(-)

diffs (212 lines):

diff -r ae23a1a94376 -r d3697efd18f3 src/auth/auth-client-connection.c
--- a/src/auth/auth-client-connection.c	Thu Feb 18 18:56:52 2010 +0200
+++ b/src/auth/auth-client-connection.c	Fri Feb 19 04:20:25 2010 +0200
@@ -24,7 +24,6 @@
 #define OUTBUF_THROTTLE_SIZE (1024*50)
 
 static ARRAY_DEFINE(auth_client_connections, struct auth_client_connection *);
-static struct timeout *to_clients;
 
 static void auth_client_connection_unref(struct auth_client_connection **_conn);
 static void auth_client_input(struct auth_client_connection *conn);
@@ -363,24 +362,9 @@
 	return NULL;
 }
 
-static void request_timeout(void *context ATTR_UNUSED)
-{
-	struct auth_client_connection *const *clients;
-
-	array_foreach(&auth_client_connections, clients) {
-		struct auth_client_connection *client = *clients;
-
-		if (client->request_handler != NULL) {
-			auth_request_handler_check_timeouts(
-				client->request_handler);
-		}
-	}
-}
-
 void auth_client_connections_init(void)
 {
 	i_array_init(&auth_client_connections, 16);
-	to_clients = timeout_add(5000, request_timeout, NULL);
 }
 
 void auth_client_connections_deinit(void)
@@ -388,9 +372,6 @@
 	struct auth_client_connection **clients;
 	unsigned int i, count;
 
-	if (to_clients != NULL)
-		timeout_remove(&to_clients);
-
 	clients = array_get_modifiable(&auth_client_connections, &count);
 	for (i = count; i > 0; i--)
 		auth_client_connection_destroy(&clients[i-1]);
diff -r ae23a1a94376 -r d3697efd18f3 src/auth/auth-request-handler.c
--- a/src/auth/auth-request-handler.c	Thu Feb 18 18:56:52 2010 +0200
+++ b/src/auth/auth-request-handler.c	Fri Feb 19 04:20:25 2010 +0200
@@ -96,25 +96,12 @@
 static void auth_request_handler_remove(struct auth_request_handler *handler,
 					struct auth_request *request)
 {
+	i_assert(request->handler == handler);
+
 	hash_table_remove(handler->requests, POINTER_CAST(request->id));
 	auth_request_unref(&request);
 }
 
-void auth_request_handler_check_timeouts(struct auth_request_handler *handler)
-{
-	struct hash_iterate_context *iter;
-	void *key, *value;
-
-	iter = hash_table_iterate_init(handler->requests);
-	while (hash_table_iterate(iter, &key, &value)) {
-		struct auth_request *request = value;
-
-		if (request->last_access + AUTH_REQUEST_TIMEOUT < ioloop_time)
-			auth_request_handler_remove(handler, request);
-	}
-	hash_table_iterate_deinit(&iter);
-}
-
 static void get_client_extra_fields(struct auth_request *request,
 				    struct auth_stream_reply *reply)
 {
@@ -192,7 +179,7 @@
 	auth_penalty_update(request->auth->penalty, request,
 			    request->last_penalty + 1);
 
-	request->last_access = ioloop_time;
+	auth_request_refresh_last_access(request);
 	aqueue_append(auth_failures, &request);
 	if (to_auth_failures == NULL) {
 		to_auth_failures =
@@ -290,6 +277,11 @@
 	auth_request_handler_remove(handler, request);
 }
 
+static void auth_request_timeout(struct auth_request *request)
+{
+	auth_request_handler_remove(request->handler, request);
+}
+
 static void auth_request_penalty_finish(struct auth_request *request)
 {
 	timeout_remove(&request->to_penalty);
@@ -343,6 +335,7 @@
 	}
 
 	request = auth_request_new(handler->auth, mech, auth_callback, handler);
+	request->handler = handler;
 	request->connect_uid = handler->connect_uid;
 	request->client_pid = handler->client_pid;
 	request->id = id;
@@ -383,6 +376,8 @@
 		return FALSE;
 	}
 
+	request->to_abort = timeout_add(AUTH_REQUEST_TIMEOUT * 1000,
+					auth_request_timeout, request);
 	hash_table_insert(handler->requests, POINTER_CAST(id), request);
 
 	if (request->auth->set->ssl_require_client_cert &&
diff -r ae23a1a94376 -r d3697efd18f3 src/auth/auth-request-handler.h
--- a/src/auth/auth-request-handler.h	Thu Feb 18 18:56:52 2010 +0200
+++ b/src/auth/auth-request-handler.h	Fri Feb 19 04:20:25 2010 +0200
@@ -30,8 +30,6 @@
 			      unsigned int connect_uid,
 			      unsigned int client_pid);
 
-void auth_request_handler_check_timeouts(struct auth_request_handler *handler);
-
 bool auth_request_handler_auth_begin(struct auth_request_handler *handler,
 				     const char *args);
 bool auth_request_handler_auth_continue(struct auth_request_handler *handler,
diff -r ae23a1a94376 -r d3697efd18f3 src/auth/auth-request.c
--- a/src/auth/auth-request.c	Thu Feb 18 18:56:52 2010 +0200
+++ b/src/auth/auth-request.c	Fri Feb 19 04:20:25 2010 +0200
@@ -62,6 +62,7 @@
 
 	auth_request->refcount = 1;
 	auth_request->last_access = ioloop_time;
+
 	auth_request->auth = auth;
 	auth_request->passdb = auth->passdbs;
 	auth_request->userdb = auth->userdbs;
@@ -82,7 +83,7 @@
 
 	request->state = AUTH_REQUEST_STATE_FINISHED;
 	request->successful = TRUE;
-	request->last_access = ioloop_time;
+	auth_request_refresh_last_access(request);
 	request->callback(request, AUTH_CLIENT_RESULT_SUCCESS,
 			  data, data_size);
 }
@@ -92,7 +93,7 @@
 	i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
 
 	request->state = AUTH_REQUEST_STATE_FINISHED;
-	request->last_access = ioloop_time;
+	auth_request_refresh_last_access(request);
 	request->callback(request, AUTH_CLIENT_RESULT_FAILURE, NULL, 0);
 }
 
@@ -116,6 +117,8 @@
 	if (--request->refcount > 0)
 		return;
 
+	if (request->to_abort != NULL)
+		timeout_remove(&request->to_abort);
 	if (request->to_penalty != NULL)
 		timeout_remove(&request->to_penalty);
 
@@ -221,7 +224,7 @@
 {
 	i_assert(request->state == AUTH_REQUEST_STATE_MECH_CONTINUE);
 
-	request->last_access = ioloop_time;
+	auth_request_refresh_last_access(request);
 	request->mech->auth_continue(request, data, data_size);
 }
 
@@ -1561,3 +1564,10 @@
 	} T_END;
 	va_end(va);
 }
+
+void auth_request_refresh_last_access(struct auth_request *request)
+{
+	request->last_access = ioloop_time;
+	if (request->to_abort != NULL)
+		timeout_reset(request->to_abort);
+}
diff -r ae23a1a94376 -r d3697efd18f3 src/auth/auth-request.h
--- a/src/auth/auth-request.h	Thu Feb 18 18:56:52 2010 +0200
+++ b/src/auth/auth-request.h	Fri Feb 19 04:20:25 2010 +0200
@@ -55,6 +55,7 @@
 	struct auth_stream_reply *userdb_reply;
 
 	const struct mech_module *mech;
+	struct auth_request_handler *handler;
 	struct auth *auth;
         struct auth_passdb *passdb;
         struct auth_userdb *userdb;
@@ -68,7 +69,7 @@
 	struct ip_addr local_ip, remote_ip;
 	unsigned int local_port, remote_port;
 
-	struct timeout *to_penalty;
+	struct timeout *to_abort, *to_penalty;
 	unsigned int last_penalty;
 	unsigned int initial_response_len;
 	const unsigned char *initial_response;
@@ -195,4 +196,6 @@
 void auth_request_userdb_callback(enum userdb_result result,
 				  struct auth_request *request);
 
+void auth_request_refresh_last_access(struct auth_request *request);
+
 #endif


More information about the dovecot-cvs mailing list