Moved connection limit checking and connect() error handling inside it.
&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;
}
#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);
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 *