From: Timo Sirainen Date: Mon, 17 Jan 2022 14:29:41 +0000 (+0100) Subject: lib-master, global: anvil_client_query() - Add timeout parameter X-Git-Tag: 2.4.0~4474 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=164a93451c8eaf93b8c844cc6a246a915e291edf;p=thirdparty%2Fdovecot%2Fcore.git lib-master, global: anvil_client_query() - Add timeout parameter The default kick command timeout should be larger than the lookup timeout. --- diff --git a/src/auth/auth-penalty.c b/src/auth/auth-penalty.c index 3816902a0a..8a8b953003 100644 --- a/src/auth/auth-penalty.c +++ b/src/auth/auth-penalty.c @@ -137,6 +137,7 @@ void auth_penalty_lookup(struct auth_penalty *penalty, T_BEGIN { anvil_client_query(penalty->client, t_strdup_printf("PENALTY-GET\t%s", ident), + ANVIL_DEFAULT_LOOKUP_TIMEOUT_MSECS, auth_penalty_anvil_callback, request); } T_END; } diff --git a/src/director/director.c b/src/director/director.c index f6243af072..6bc303b696 100644 --- a/src/director/director.c +++ b/src/director/director.c @@ -1111,6 +1111,7 @@ void director_kill_user(struct director *dir, struct director_host *src, user->username_hash); dir->users_kicking_count++; ctx->anvil_cmd = anvil_client_query(dir->anvil, cmd, + ANVIL_DEFAULT_KICK_TIMEOUT_MSECS, director_kill_user_callback, ctx); } else { /* a) we didn't even know about the user before now. @@ -1209,6 +1210,7 @@ void director_kick_user(struct director *dir, struct director_host *src, str_append_tabescaped(cmd, username); dir->users_kicking_count++; anvil_client_query(dir->anvil, str_c(cmd), + ANVIL_DEFAULT_KICK_TIMEOUT_MSECS, director_kick_user_callback, dir); if (orig_src == NULL) { @@ -1235,6 +1237,7 @@ void director_kick_user_alt(struct director *dir, struct director_host *src, str_append_tabescaped(cmd, value); dir->users_kicking_count++; anvil_client_query(dir->anvil, str_c(cmd), + ANVIL_DEFAULT_KICK_TIMEOUT_MSECS, director_kick_user_callback, dir); if (orig_src == NULL) { @@ -1263,6 +1266,7 @@ void director_kick_user_hash(struct director *dir, struct director_host *src, username_hash, net_ip2addr(except_ip)); dir->users_kicking_count++; anvil_client_query(dir->anvil, cmd, + ANVIL_DEFAULT_KICK_TIMEOUT_MSECS, director_kick_user_callback, dir); if (orig_src == NULL) { diff --git a/src/doveadm/doveadm-kick.c b/src/doveadm/doveadm-kick.c index 0ebb83dc6e..4247bd0062 100644 --- a/src/doveadm/doveadm-kick.c +++ b/src/doveadm/doveadm-kick.c @@ -91,6 +91,7 @@ static void kick_users_via_anvil(struct kick_context *ctx) } anvil_client_query(anvil, str_c(cmd), + ANVIL_DEFAULT_KICK_TIMEOUT_MSECS, kick_user_anvil_callback, ctx); io_loop_run(current_ioloop); } diff --git a/src/lib-master/anvil-client.c b/src/lib-master/anvil-client.c index 79af1da8ea..08c0487afa 100644 --- a/src/lib-master/anvil-client.c +++ b/src/lib-master/anvil-client.c @@ -20,6 +20,7 @@ struct anvil_query { struct anvil_client *client; struct timeout *to; + unsigned int timeout_msecs; anvil_callback_t *callback; void *context; @@ -47,7 +48,6 @@ struct anvil_client { #define ANVIL_INBUF_SIZE 1024 #define ANVIL_RECONNECT_MIN_SECS 5 -#define ANVIL_QUERY_TIMEOUT_MSECS (1000*5) static void anvil_client_destroy(struct connection *conn); static int anvil_client_input_line(struct connection *conn, const char *line); @@ -305,8 +305,9 @@ static void anvil_client_timeout(struct anvil_query *anvil_query) i_assert(aqueue_count(client->queries) > 0); e_error(client->conn.event, - "Anvil queries timed out after %u secs - aborting queries", - ANVIL_QUERY_TIMEOUT_MSECS/1000); + "Anvil queries timed out after %u.%03u secs - aborting queries", + anvil_query->timeout_msecs / 1000, + anvil_query->timeout_msecs % 1000); /* perhaps reconnect helps */ anvil_client_destroy(&client->conn); } @@ -330,12 +331,16 @@ static int anvil_client_send(struct anvil_client *client, const char *cmd) struct anvil_query * anvil_client_query(struct anvil_client *client, const char *query, + unsigned int timeout_msecs, anvil_callback_t *callback, void *context) { struct anvil_query *anvil_query; + i_assert(timeout_msecs > 0); + anvil_query = i_new(struct anvil_query, 1); anvil_query->client = client; + anvil_query->timeout_msecs = timeout_msecs; anvil_query->callback = callback; anvil_query->context = context; aqueue_append(client->queries, &anvil_query); @@ -349,7 +354,7 @@ anvil_client_query(struct anvil_client *client, const char *query, anvil_client_cancel_queries, client); } } else { - anvil_query->to = timeout_add(ANVIL_QUERY_TIMEOUT_MSECS, + anvil_query->to = timeout_add(timeout_msecs, anvil_client_timeout, anvil_query); } return anvil_query; diff --git a/src/lib-master/anvil-client.h b/src/lib-master/anvil-client.h index a085a6a2d2..33fd59d8d8 100644 --- a/src/lib-master/anvil-client.h +++ b/src/lib-master/anvil-client.h @@ -1,6 +1,9 @@ #ifndef ANVIL_CLIENT_H #define ANVIL_CLIENT_H +#define ANVIL_DEFAULT_LOOKUP_TIMEOUT_MSECS (5*1000) +#define ANVIL_DEFAULT_KICK_TIMEOUT_MSECS (25*1000) + enum anvil_client_flags { /* if connect() fails with ENOENT, hide the error */ ANVIL_CLIENT_FLAG_HIDE_ENOENT = 0x01 @@ -39,6 +42,7 @@ int anvil_client_connect(struct anvil_client *client, bool retry); be sent. */ struct anvil_query * anvil_client_query(struct anvil_client *client, const char *query, + unsigned int timeout_msecs, anvil_callback_t *callback, void *context); void anvil_client_query_abort(struct anvil_client *client, struct anvil_query **query); diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index fc48298e0c..1e961a9344 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -358,6 +358,7 @@ int lmtp_local_rcpt(struct client *client, str_tabescape(input->username), "\t", master_service_get_name(master_service), "\t", NULL); llrcpt->anvil_query = anvil_client_query(anvil, query, + ANVIL_DEFAULT_LOOKUP_TIMEOUT_MSECS, lmtp_local_rcpt_anvil_cb, llrcpt); return 0; } diff --git a/src/login-common/sasl-server.c b/src/login-common/sasl-server.c index 492016b1b6..3237574e98 100644 --- a/src/login-common/sasl-server.c +++ b/src/login-common/sasl-server.c @@ -279,7 +279,9 @@ anvil_check_too_many_connections(struct client *client, net_ip2addr(&client->ip), NULL); client->anvil_request = req; client->anvil_query = - anvil_client_query(anvil, query, anvil_lookup_callback, req); + anvil_client_query(anvil, query, + ANVIL_DEFAULT_LOOKUP_TIMEOUT_MSECS, + anvil_lookup_callback, req); } static bool