]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
indexer: Refactor worker_connection_create() to _try_create()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 26 Jan 2022 18:02:37 +0000 (19:02 +0100)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Sun, 13 Feb 2022 10:23:26 +0000 (10:23 +0000)
Moved connection limit checking and connect() error handling inside it.

src/indexer/worker-connection.c
src/indexer/worker-connection.h
src/indexer/worker-pool.c

index a68e0f1d9bd5f9f5f67bb2dbb77bbed876ecc08d..32e218124e6e9d21719a2fe526fec6cf93fc8cb3 100644 (file)
@@ -195,18 +195,28 @@ struct connection_list *worker_connection_list_create(void)
                                    &worker_connection_vfuncs);
 }
 
-struct connection *
-worker_connection_create(const char *socket_path,
-                        indexer_status_callback_t *callback,
-                        worker_available_callback_t *avail_callback,
-                        struct connection_list *list)
+int worker_connection_try_create(const char *socket_path,
+                                indexer_status_callback_t *callback,
+                                worker_available_callback_t *avail_callback,
+                                struct connection_list *list,
+                                struct connection **conn_r)
 {
        struct worker_connection *conn;
+       unsigned int max_connections;
+
+       max_connections = I_MAX(1, worker_connections_get_process_limit());
+       if (list->connections_count >= max_connections)
+               return 0;
 
        conn = i_new(struct worker_connection, 1);
        conn->callback = callback;
        conn->avail_callback = avail_callback;
        connection_init_client_unix(list, &conn->conn, socket_path);
+       if (connection_client_connect(&conn->conn) < 0) {
+               worker_connection_destroy(&conn->conn);
+               return -1;
+       }
 
-       return &conn->conn;
+       *conn_r = &conn->conn;
+       return 1;
 }
index e664c7ea6095e514b6300c960e4cf9f8b1362e4a..1840cbb338a40803072e4f8babed021cd10d6c47 100644 (file)
@@ -4,15 +4,19 @@
 #include "indexer.h"
 
 struct indexer_request;
+struct connection;
 struct connection_list;
 
 typedef void worker_available_callback_t(void);
 
-struct connection *
-worker_connection_create(const char *socket_path,
-                        indexer_status_callback_t *callback,
-                        worker_available_callback_t *avail_callback,
-                        struct connection_list *list);
+/* Try to create a new worker connection. Returns 1 if successful, 0 if
+   indexer-worker service's process_limit was already reached, -1 on connect
+   error. */
+int worker_connection_try_create(const char *socket_path,
+                                indexer_status_callback_t *callback,
+                                worker_available_callback_t *avail_callback,
+                                struct connection_list *list,
+                                struct connection **conn_r);
 void worker_connection_destroy(struct connection *conn);
 
 struct connection_list *worker_connection_list_create(void);
index e0de136aa5a0d5274e9bffceade21a603e180611..3ebab8c83b7a9625f81c8ea81980a5d090f974f1 100644 (file)
@@ -51,35 +51,12 @@ bool worker_pool_have_connections(struct worker_pool *pool)
        return pool->connection_list->connections != NULL;
 }
 
-static int worker_pool_add_connection(struct worker_pool *pool,
-                                     struct connection **conn_r)
-{
-       struct connection *conn;
-
-       conn = worker_connection_create(pool->socket_path, pool->callback,
-                                       pool->avail_callback,
-                                       pool->connection_list);
-       if (connection_client_connect(conn) < 0) {
-               worker_connection_destroy(conn);
-               return -1;
-       }
-
-       *conn_r = conn;
-       return 0;
-}
-
 bool worker_pool_get_connection(struct worker_pool *pool,
                                struct connection **conn_r)
 {
-       unsigned int max_connections;
-
-       max_connections = I_MAX(1, worker_connections_get_process_limit());
-       if (pool->connection_list->connections_count >= max_connections)
-               return FALSE;
-       if (worker_pool_add_connection(pool, conn_r) < 0)
-               return FALSE;
-
-       return TRUE;
+       return worker_connection_try_create(pool->socket_path, pool->callback,
+                                           pool->avail_callback,
+                                           pool->connection_list, conn_r) > 0;
 }
 
 struct connection *