mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-21 22:01:31 +02:00
MINOR: connection: centralize init/deinit of backend elements
A connection contains extra elements which are only used for the backend side. Regroup their allocation and deallocation in two new functions named conn_backend_init() and conn_backend_deinit(). No functional change is introduced with this commit. The new functions are reused in place of manual alloc/dealloc in conn_new() / conn_free(). This patch will be useful for reverse connect support with connection conversion from backend to frontend side and vice-versa.
This commit is contained in:
parent
fbe35afaa4
commit
d8d9122a02
@ -1602,11 +1602,6 @@ skip_reuse:
|
|||||||
srv_conn->src = bind_addr;
|
srv_conn->src = bind_addr;
|
||||||
bind_addr = NULL;
|
bind_addr = NULL;
|
||||||
|
|
||||||
if (!sockaddr_alloc(&srv_conn->dst, 0, 0)) {
|
|
||||||
conn_free(srv_conn);
|
|
||||||
return SF_ERR_RESOURCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
srv_conn->hash_node->node.key = hash;
|
srv_conn->hash_node->node.key = hash;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -437,6 +437,49 @@ void conn_init(struct connection *conn, void *target)
|
|||||||
conn->xprt = NULL;
|
conn->xprt = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize members used for backend connections.
|
||||||
|
*
|
||||||
|
* Returns 0 on success else non-zero.
|
||||||
|
*/
|
||||||
|
static int conn_backend_init(struct connection *conn)
|
||||||
|
{
|
||||||
|
if (!sockaddr_alloc(&conn->dst, 0, 0))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
conn->hash_node = conn_alloc_hash_node(conn);
|
||||||
|
if (unlikely(!conn->hash_node))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Release connection elements reserved for backend side usage. It also takes
|
||||||
|
* care to detach it if linked to a session or a server instance.
|
||||||
|
*
|
||||||
|
* This function is useful when freeing a connection or reversing it to the
|
||||||
|
* frontend side.
|
||||||
|
*/
|
||||||
|
static void conn_backend_deinit(struct connection *conn)
|
||||||
|
{
|
||||||
|
/* If the connection is owned by the session, remove it from its list
|
||||||
|
*/
|
||||||
|
if (conn_is_back(conn) && LIST_INLIST(&conn->session_list)) {
|
||||||
|
session_unown_conn(conn->owner, conn);
|
||||||
|
}
|
||||||
|
else if (!(conn->flags & CO_FL_PRIVATE)) {
|
||||||
|
if (obj_type(conn->target) == OBJ_TYPE_SERVER)
|
||||||
|
srv_release_conn(__objt_server(conn->target), conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure the connection is not left in the idle connection tree */
|
||||||
|
if (conn->hash_node != NULL)
|
||||||
|
BUG_ON(conn->hash_node->node.node.leaf_p != NULL);
|
||||||
|
|
||||||
|
pool_free(pool_head_conn_hash_node, conn->hash_node);
|
||||||
|
conn->hash_node = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* Tries to allocate a new connection and initialized its main fields. The
|
/* Tries to allocate a new connection and initialized its main fields. The
|
||||||
* connection is returned on success, NULL on failure. The connection must
|
* connection is returned on success, NULL on failure. The connection must
|
||||||
* be released using pool_free() or conn_free().
|
* be released using pool_free() or conn_free().
|
||||||
@ -444,7 +487,6 @@ void conn_init(struct connection *conn, void *target)
|
|||||||
struct connection *conn_new(void *target)
|
struct connection *conn_new(void *target)
|
||||||
{
|
{
|
||||||
struct connection *conn;
|
struct connection *conn;
|
||||||
struct conn_hash_node *hash_node;
|
|
||||||
|
|
||||||
conn = pool_alloc(pool_head_connection);
|
conn = pool_alloc(pool_head_connection);
|
||||||
if (unlikely(!conn))
|
if (unlikely(!conn))
|
||||||
@ -456,13 +498,10 @@ struct connection *conn_new(void *target)
|
|||||||
if (obj_type(target) == OBJ_TYPE_SERVER)
|
if (obj_type(target) == OBJ_TYPE_SERVER)
|
||||||
srv_use_conn(__objt_server(target), conn);
|
srv_use_conn(__objt_server(target), conn);
|
||||||
|
|
||||||
hash_node = conn_alloc_hash_node(conn);
|
if (conn_backend_init(conn)) {
|
||||||
if (unlikely(!hash_node)) {
|
conn_free(conn);
|
||||||
pool_free(pool_head_connection, conn);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
conn->hash_node = hash_node;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return conn;
|
return conn;
|
||||||
@ -471,15 +510,8 @@ struct connection *conn_new(void *target)
|
|||||||
/* Releases a connection previously allocated by conn_new() */
|
/* Releases a connection previously allocated by conn_new() */
|
||||||
void conn_free(struct connection *conn)
|
void conn_free(struct connection *conn)
|
||||||
{
|
{
|
||||||
/* If the connection is owned by the session, remove it from its list
|
if (conn_is_back(conn))
|
||||||
*/
|
conn_backend_deinit(conn);
|
||||||
if (conn_is_back(conn) && LIST_INLIST(&conn->session_list)) {
|
|
||||||
session_unown_conn(conn->owner, conn);
|
|
||||||
}
|
|
||||||
else if (!(conn->flags & CO_FL_PRIVATE)) {
|
|
||||||
if (obj_type(conn->target) == OBJ_TYPE_SERVER)
|
|
||||||
srv_release_conn(__objt_server(conn->target), conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remove the conn from toremove_list.
|
/* Remove the conn from toremove_list.
|
||||||
*
|
*
|
||||||
@ -498,13 +530,6 @@ void conn_free(struct connection *conn)
|
|||||||
pool_free(pool_head_uniqueid, istptr(conn->proxy_unique_id));
|
pool_free(pool_head_uniqueid, istptr(conn->proxy_unique_id));
|
||||||
conn->proxy_unique_id = IST_NULL;
|
conn->proxy_unique_id = IST_NULL;
|
||||||
|
|
||||||
/* Make sure the connection is not left in the idle connection tree */
|
|
||||||
if (conn->hash_node != NULL)
|
|
||||||
BUG_ON(conn->hash_node->node.node.leaf_p != NULL);
|
|
||||||
|
|
||||||
pool_free(pool_head_conn_hash_node, conn->hash_node);
|
|
||||||
conn->hash_node = NULL;
|
|
||||||
|
|
||||||
conn_force_unsubscribe(conn);
|
conn_force_unsubscribe(conn);
|
||||||
pool_free(pool_head_connection, conn);
|
pool_free(pool_head_connection, conn);
|
||||||
}
|
}
|
||||||
|
@ -5926,10 +5926,12 @@ void srv_release_conn(struct server *srv, struct connection *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Remove the connection from any tree (safe, idle or available) */
|
/* Remove the connection from any tree (safe, idle or available) */
|
||||||
|
if (conn->hash_node) {
|
||||||
HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
|
HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
|
||||||
conn_delete_from_tree(&conn->hash_node->node);
|
conn_delete_from_tree(&conn->hash_node->node);
|
||||||
conn->flags &= ~CO_FL_LIST_MASK;
|
conn->flags &= ~CO_FL_LIST_MASK;
|
||||||
HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
|
HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* retrieve a connection from its <hash> in <tree>
|
/* retrieve a connection from its <hash> in <tree>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user