dovecot-2.2: auth: If worker request has been queued for 60 secs...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Jun 9 00:06:49 EEST 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/dbf8bbb7e51e
changeset: 16478:dbf8bbb7e51e
user: Timo Sirainen <tss at iki.fi>
date: Sun Jun 09 00:06:42 2013 +0300
description:
auth: If worker request has been queued for 60 secs, abort it.
diffstat:
src/auth/auth-worker-server.c | 41 +++++++++++++++++++++++++++--------------
1 files changed, 27 insertions(+), 14 deletions(-)
diffs (89 lines):
diff -r ee2a3cf464f4 -r dbf8bbb7e51e src/auth/auth-worker-server.c
--- a/src/auth/auth-worker-server.c Fri Jun 07 22:06:24 2013 +0300
+++ b/src/auth/auth-worker-server.c Sun Jun 09 00:06:42 2013 +0300
@@ -19,6 +19,7 @@
#define AUTH_WORKER_LOOKUP_TIMEOUT_SECS 60
#define AUTH_WORKER_MAX_IDLE_SECS (60*5)
+#define AUTH_WORKER_ABORT_SECS 60
#define AUTH_WORKER_DELAY_WARN_SECS 3
#define AUTH_WORKER_DELAY_WARN_MIN_INTERVAL_SECS 300
@@ -76,20 +77,29 @@
auth_worker_destroy(&conn, "Lookup timed out", TRUE);
}
-static void auth_worker_request_send(struct auth_worker_connection *conn,
+static bool auth_worker_request_send(struct auth_worker_connection *conn,
struct auth_worker_request *request)
{
struct const_iovec iov[3];
+ unsigned int age_secs = ioloop_time - request->created;
- if (ioloop_time - request->created > AUTH_WORKER_DELAY_WARN_SECS &&
+ if (age_secs >= AUTH_WORKER_ABORT_SECS) {
+ i_error("Aborting auth request that was queued for %d secs, "
+ "%d left in queue",
+ age_secs, aqueue_count(worker_request_queue));
+ request->callback(t_strdup_printf(
+ "FAIL\t%d", PASSDB_RESULT_INTERNAL_FAILURE),
+ request->context);
+ return FALSE;
+ }
+ if (age_secs >= AUTH_WORKER_DELAY_WARN_SECS &&
ioloop_time - auth_worker_last_warn >
AUTH_WORKER_DELAY_WARN_MIN_INTERVAL_SECS) {
auth_worker_last_warn = ioloop_time;
i_warning("auth workers: Auth request was queued for %d "
"seconds, %d left in queue "
"(see auth_worker_max_count)",
- (int)(ioloop_time - request->created),
- aqueue_count(worker_request_queue));
+ age_secs, aqueue_count(worker_request_queue));
}
request->id = ++conn->id_counter;
@@ -110,20 +120,22 @@
conn->to = timeout_add(AUTH_WORKER_LOOKUP_TIMEOUT_SECS * 1000,
auth_worker_call_timeout, conn);
idle_count--;
+ return TRUE;
}
static void auth_worker_request_send_next(struct auth_worker_connection *conn)
{
struct auth_worker_request *request, *const *requestp;
- if (aqueue_count(worker_request_queue) == 0)
- return;
+ do {
+ if (aqueue_count(worker_request_queue) == 0)
+ return;
- requestp = array_idx(&worker_request_array,
- aqueue_idx(worker_request_queue, 0));
- request = *requestp;
- aqueue_delete_tail(worker_request_queue);
- auth_worker_request_send(conn, request);
+ requestp = array_idx(&worker_request_array,
+ aqueue_idx(worker_request_queue, 0));
+ request = *requestp;
+ aqueue_delete_tail(worker_request_queue);
+ } while (!auth_worker_request_send(conn, request));
}
static void auth_worker_send_handshake(struct auth_worker_connection *conn)
@@ -410,9 +422,10 @@
conn = auth_worker_create();
}
}
- if (conn != NULL)
- auth_worker_request_send(conn, request);
- else {
+ if (conn != NULL) {
+ if (!auth_worker_request_send(conn, request))
+ i_unreached();
+ } else {
/* reached the limit, queue the request */
aqueue_append(worker_request_queue, &request);
}
More information about the dovecot-cvs
mailing list