]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master, global: anvil_client_query() - Add timeout parameter
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 17 Jan 2022 14:29:41 +0000 (15:29 +0100)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
The default kick command timeout should be larger than the lookup timeout.

src/auth/auth-penalty.c
src/director/director.c
src/doveadm/doveadm-kick.c
src/lib-master/anvil-client.c
src/lib-master/anvil-client.h
src/lmtp/lmtp-local.c
src/login-common/sasl-server.c

index 3816902a0a2c03cc714916575e51e1311069bebd..8a8b953003769c510ce2abd447a8f6969984b85d 100644 (file)
@@ -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;
 }
index f6243af072800eb9e45bbe00ca5207fc116ba3aa..6bc303b696db407ab5ffba4b74df59e1253e7618 100644 (file)
@@ -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) {
index 0ebb83dc6edcce129fbe68299a5e90ba43e96cca..4247bd00620c6d04c9e84925f338c3ea3d293f78 100644 (file)
@@ -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);
        }
index 79af1da8ea66f643755b351ab54af10b32acbc2a..08c0487afa9fc7b45a51656168ed28cb3c38959b 100644 (file)
@@ -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;
index a085a6a2d2f07cef7e3aa9c28569a2a504e47d6a..33fd59d8d87345dc3666a182a82e1a696a4b8095 100644 (file)
@@ -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);
index fc48298e0c34278b0fd4d2b8ac548991238fcfe8..1e961a9344b9d55a6361e5cc0a7664a8208596ea 100644 (file)
@@ -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;
        }
index 492016b1b657b73b4f55f9beebb2298236ccec95..3237574e98e727d36182800600bed0d0759b244f 100644 (file)
@@ -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