mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-31 10:31:46 +00:00
BUG/MAJOR: mux-pt: Always destroy the backend connection on detach
In TCP, when a conn-stream is detached from a backend connection, the connection must be always closed. It was only performed if an error or a shutdown occurred or if there was no connection owner. But it is a problem, because, since the 2.3, backend connections are always owned by a session. This way it is possible to have idle connections attached to a session instead of a server. But there is no idle connections in TCP. In addition, when a session owns a connection it is responsible to close it when it is released. But it only works for idle connections. And it only works if the session is released. Thus there is the place for bugs here. And indeed, a connection leak may occur if a connection retry is performed because of a timeout. In this case, the underlying connection is still alive and is waiting to be fully established. Thus, when the conn-stream is detached from the connection, the connection is not closed. Because the PT multiplexer is quite simple, there is no timeout at this stage. We depend on the kenerl to be notified and finally close the connection. With an unreachable server, orphan backend connections may be accumulated for a while. It may be perceived as a leak. Because there is no reason to keep such backend connections, we just close it now. Frontend connections are still closed by the session or when an error or a shutdown occurs. This patch should fix the issue #1522. It must be backported as far as 2.0. Note that the 2.2 and 2.0 are not affected by this bug because there is no owner for backend TCP connections. But it is probably a good idea to backport the patch on these versions to avoid any future bugs.
This commit is contained in:
parent
a6a3279188
commit
fbff854250
@ -415,7 +415,7 @@ static void mux_pt_detach(struct conn_stream *cs)
|
||||
TRACE_ENTER(PT_EV_STRM_END, conn, cs);
|
||||
|
||||
/* Subscribe, to know if we got disconnected */
|
||||
if (conn->owner != NULL &&
|
||||
if (!conn_is_back(conn) && conn->owner != NULL &&
|
||||
!(conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))) {
|
||||
ctx->cs = NULL;
|
||||
conn->xprt->subscribe(conn, conn->xprt_ctx, SUB_RETRY_RECV, &ctx->wait_event);
|
||||
|
Loading…
Reference in New Issue
Block a user