Mercurial > dovecot > original-hg > dovecot-1.2
changeset 8987:0d3b712342d9 HEAD
ldap: If first request is over 60 seconds old while a new request comes, reconnect.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 29 Apr 2009 12:40:24 -0400 |
parents | d475e17d01a3 |
children | 37c0111961f5 |
files | src/auth/db-ldap.c |
diffstat | 1 files changed, 31 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/auth/db-ldap.c Wed Apr 29 12:40:48 2009 -0400 +++ b/src/auth/db-ldap.c Wed Apr 29 12:40:24 2009 -0400 @@ -380,6 +380,36 @@ } } +static bool +db_ldap_check_limits(struct ldap_connection *conn, struct ldap_request *request) +{ + struct ldap_request *const *first_requestp; + unsigned int count; + time_t secs_diff; + + count = aqueue_count(conn->request_queue); + if (count == 0) + return TRUE; + + first_requestp = array_idx(&conn->request_array, + aqueue_idx(conn->request_queue, 0)); + secs_diff = ioloop_time - (*first_requestp)->create_time; + if (secs_diff > DB_LDAP_REQUEST_LOST_TIMEOUT_SECS) { + auth_request_log_error(request->auth_request, "ldap", + "Connection appears to be hanging, reconnecting"); + ldap_conn_reconnect(conn); + return TRUE; + } + if (conn->request_queue->full && count >= DB_LDAP_MAX_QUEUE_SIZE) { + /* Queue is full already, fail this request */ + auth_request_log_error(request->auth_request, "ldap", + "Request queue is full (oldest added %d secs ago)", + (int)secs_diff); + return FALSE; + } + return TRUE; +} + void db_ldap_request(struct ldap_connection *conn, struct ldap_request *request) { @@ -388,16 +418,7 @@ request->msgid = -1; request->create_time = ioloop_time; - if (conn->request_queue->full && - aqueue_count(conn->request_queue) >= DB_LDAP_MAX_QUEUE_SIZE) { - /* Queue is full already, fail this request */ - struct ldap_request *const *first_requestp; - - first_requestp = array_idx(&conn->request_array, - aqueue_idx(conn->request_queue, 0)); - auth_request_log_error(request->auth_request, "ldap", - "Request queue is full (oldest added %d secs ago)", - (int)(time(NULL) - (*first_requestp)->create_time)); + if (!db_ldap_check_limits(conn, request)) { request->callback(conn, request, NULL); return; }