Mercurial > dovecot > core-2.2
changeset 10757:d3697efd18f3 HEAD
auth: Don't loop through active requests every 5 seconds, looking for timeouts.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 19 Feb 2010 04:20:25 +0200 |
parents | ae23a1a94376 |
children | fa8a0f453774 |
files | src/auth/auth-client-connection.c src/auth/auth-request-handler.c src/auth/auth-request-handler.h src/auth/auth-request.c src/auth/auth-request.h |
diffstat | 5 files changed, 28 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- 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]);
--- 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 &&
--- 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,
--- 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); +}
--- 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