From: Timo Sirainen Date: Wed, 26 Jan 2022 18:02:37 +0000 (+0100) Subject: indexer: Refactor worker_connection_create() to _try_create() X-Git-Tag: 2.4.0~4436 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=970573a18480949ca5cf25a1497553d720c865bd;p=thirdparty%2Fdovecot%2Fcore.git indexer: Refactor worker_connection_create() to _try_create() Moved connection limit checking and connect() error handling inside it. --- diff --git a/src/indexer/worker-connection.c b/src/indexer/worker-connection.c index a68e0f1d9b..32e218124e 100644 --- a/src/indexer/worker-connection.c +++ b/src/indexer/worker-connection.c @@ -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; } diff --git a/src/indexer/worker-connection.h b/src/indexer/worker-connection.h index e664c7ea60..1840cbb338 100644 --- a/src/indexer/worker-connection.h +++ b/src/indexer/worker-connection.h @@ -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); diff --git a/src/indexer/worker-pool.c b/src/indexer/worker-pool.c index e0de136aa5..3ebab8c83b 100644 --- a/src/indexer/worker-pool.c +++ b/src/indexer/worker-pool.c @@ -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 *