mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-03 18:52:04 +00:00
MEDIUM: htx: Try to take a connection over if it has no owner.
In the mux detach function, when using HTX, take the connection over if it no longer has an owner (ie because the session that was the owner left). It is done for legacy code in proto_http.c, but not for HTX. Also when using HTX, in H2, try to add the connection back to idle_conns if it was not already (ie we used to use all the available streams, and we're freeing one). That too was done in proto_http.c.
This commit is contained in:
parent
a70e176843
commit
44d59146a6
15
src/mux_h1.c
15
src/mux_h1.c
@ -22,6 +22,7 @@
|
||||
#include <proto/connection.h>
|
||||
#include <proto/http_htx.h>
|
||||
#include <proto/log.h>
|
||||
#include <proto/session.h>
|
||||
#include <proto/stream.h>
|
||||
#include <proto/stream_interface.h>
|
||||
|
||||
@ -1925,13 +1926,21 @@ static void h1_detach(struct conn_stream *cs)
|
||||
h1c = h1s->h1c;
|
||||
h1s->cs = NULL;
|
||||
|
||||
if (conn_is_back(h1c->conn) && (h1s->flags & H1S_F_WANT_KAL) && h1c->conn->owner) {
|
||||
if (conn_is_back(h1c->conn) && (h1s->flags & H1S_F_WANT_KAL) &&
|
||||
!(h1c->conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))) {
|
||||
struct stream_interface *si = cs->data;
|
||||
struct stream *s = si_strm(si);
|
||||
|
||||
/* Never ever allow to reuse a connection from a non-reuse backend */
|
||||
if (h1c->conn && (h1c->px->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR)
|
||||
if ((h1c->px->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR)
|
||||
h1c->conn->flags |= CO_FL_PRIVATE;
|
||||
|
||||
if (!(h1c->conn->owner)) {
|
||||
h1c->conn->owner = s->sess;
|
||||
session_add_conn(s->sess, h1c->conn, s->target);
|
||||
}
|
||||
/* we're in keep-alive with an idle connection, monitor it if not already done */
|
||||
if (h1c->conn && LIST_ISEMPTY(&h1c->conn->list)) {
|
||||
if (LIST_ISEMPTY(&h1c->conn->list)) {
|
||||
struct server *srv = objt_server(h1c->conn->target);
|
||||
|
||||
if (srv) {
|
||||
|
30
src/mux_h2.c
30
src/mux_h2.c
@ -22,7 +22,9 @@
|
||||
#include <common/net_helper.h>
|
||||
#include <proto/connection.h>
|
||||
#include <proto/http_htx.h>
|
||||
#include <proto/session.h>
|
||||
#include <proto/stream.h>
|
||||
#include <proto/stream_interface.h>
|
||||
#include <types/session.h>
|
||||
#include <eb32tree.h>
|
||||
|
||||
@ -2815,6 +2817,34 @@ static void h2_detach(struct conn_stream *cs)
|
||||
return;
|
||||
|
||||
h2c = h2s->h2c;
|
||||
if (h2c->proxy->options2 & PR_O2_USE_HTX) {
|
||||
struct stream_interface *si;
|
||||
struct stream *s;
|
||||
|
||||
si = cs->data;
|
||||
s = si_strm(si);
|
||||
if (!(h2c->conn->flags &
|
||||
(CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))) {
|
||||
if (!h2c->conn->owner) {
|
||||
h2c->conn->owner = s->sess;
|
||||
session_add_conn(s->sess, h2c->conn, s->target);
|
||||
}
|
||||
/* Never ever allow to reuse a connection from a non-reuse backend */
|
||||
if ((h2c->proxy->options & PR_O_REUSE_MASK) == PR_O_REUSE_NEVR)
|
||||
h2c->conn->flags |= CO_FL_PRIVATE;
|
||||
if (LIST_ISEMPTY(&h2c->conn->list)) {
|
||||
struct server *srv = objt_server(h2c->conn->target);
|
||||
|
||||
if (srv) {
|
||||
if (h2c->conn->flags & CO_FL_PRIVATE)
|
||||
LIST_ADD(&srv->priv_conns[tid], &h2c->conn->list);
|
||||
else
|
||||
LIST_ADD(&srv->idle_conns[tid], &h2c->conn->list);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
h2s->cs = NULL;
|
||||
h2c->nb_cs--;
|
||||
if (h2c->flags & H2_CF_DEM_TOOMANY &&
|
||||
|
Loading…
Reference in New Issue
Block a user