]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Set proper error string to anvil_callback_t
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 21 Mar 2025 18:30:54 +0000 (20:30 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 28 Mar 2025 09:55:03 +0000 (09:55 +0000)
src/lib-master/anvil-client.c

index b1020a93f99d2b1eef21e6bd0f77304f69018fb6..23edb7ec45718d7219e857bc30d7feec9bdd05c8 100644 (file)
@@ -30,6 +30,7 @@ struct anvil_client {
        struct connection conn;
        struct timeout *to_cancel;
 
+       char *last_connect_error;
        struct timeout *to_reconnect;
        time_t last_reconnect;
 
@@ -106,6 +107,7 @@ void anvil_client_deinit(struct anvil_client **_client)
        aqueue_deinit(&client->queries);
        i_assert(client->to_reconnect == NULL);
        connection_deinit(&client->conn);
+       i_free(client->last_connect_error);
        i_free(client);
 
        if (anvil_connections->connections == NULL)
@@ -248,11 +250,14 @@ int anvil_client_connect(struct anvil_client *client, bool retry)
        ret = retry ? connection_client_connect_with_retries(&client->conn, 5000) :
                connection_client_connect(&client->conn);
        if (ret < 0) {
+               i_free(client->last_connect_error);
+               client->last_connect_error = i_strdup_printf(
+                       "net_connect_unix(%s) failed: %m",
+                       client->conn.base_name);
                if (errno != ENOENT ||
                    (client->flags & ANVIL_CLIENT_FLAG_HIDE_ENOENT) == 0) {
-                       e_error(client->conn.event,
-                               "net_connect_unix(%s) failed: %m",
-                               client->conn.base_name);
+                       e_error(client->conn.event, "%s",
+                               client->last_connect_error);
                }
                return -1;
        }
@@ -269,7 +274,7 @@ int anvil_client_connect(struct anvil_client *client, bool retry)
 }
 
 static void
-anvil_client_cancel_queries(struct anvil_client *client)
+anvil_client_cancel_queries(struct anvil_client *client, const char *reason)
 {
        struct anvil_query *const *queries, *query;
        unsigned int count;
@@ -278,7 +283,7 @@ anvil_client_cancel_queries(struct anvil_client *client)
        while (aqueue_count(client->queries) > 0) {
                query = queries[aqueue_idx(client->queries, 0)];
                if (query->callback != NULL) {
-                       struct anvil_reply reply = { .error = "Failed" };
+                       struct anvil_reply reply = { .error = reason };
                        query->callback(&reply, query->context);
                }
                anvil_query_free(&query);
@@ -296,23 +301,31 @@ static void anvil_client_destroy(struct connection *conn)
        i_stream_destroy(&client->cmd_input);
        o_stream_destroy(&client->cmd_output);
        connection_disconnect(&client->conn);
-       anvil_client_cancel_queries(client);
+       anvil_client_cancel_queries(client, connection_disconnect_reason(conn));
        timeout_remove(&client->to_reconnect);
 
        if (!client->deinitializing)
                anvil_client_reconnect(client);
 }
 
+static void anvil_client_connect_failed(struct anvil_client *client)
+{
+       i_assert(client->last_connect_error != NULL);
+
+       anvil_client_cancel_queries(client, client->last_connect_error);
+       i_free(client->last_connect_error);
+}
+
 static void anvil_client_timeout(struct anvil_query *anvil_query)
 {
        struct anvil_client *client = anvil_query->client;
 
        i_assert(aqueue_count(client->queries) > 0);
 
-       e_error(client->conn.event,
+       anvil_client_cancel_queries(client, t_strdup_printf(
                "Anvil queries timed out after %u.%03u secs - aborting queries",
                anvil_query->timeout_msecs / 1000,
-               anvil_query->timeout_msecs % 1000);
+               anvil_query->timeout_msecs % 1000));
        /* perhaps reconnect helps */
        anvil_client_destroy(&client->conn);
 }
@@ -357,7 +370,7 @@ anvil_client_query(struct anvil_client *client, const char *query,
                if (client->to_cancel == NULL) {
                        client->to_cancel =
                                timeout_add_short(0,
-                                       anvil_client_cancel_queries, client);
+                                       anvil_client_connect_failed, client);
                }
        } else {
                anvil_query->to = timeout_add(timeout_msecs,