MEDIUM: session: Steal owner-less connections on end of transaction.

When a transaction ends, if we want to do keepalive, and the connection we
used didn't have an owner, attach the connection to the session, so that we
don't have to destroy it, and we can reuse it later.
This commit is contained in:
Olivier Houchard 2018-11-30 17:31:52 +01:00 committed by Willy Tarreau
parent 00cf70f28b
commit 985f139aa2

View File

@ -70,6 +70,7 @@
#include <proto/queue.h>
#include <proto/sample.h>
#include <proto/server.h>
#include <proto/session.h>
#include <proto/stream.h>
#include <proto/stream_interface.h>
#include <proto/task.h>
@ -3748,10 +3749,6 @@ void http_end_txn_clean_session(struct stream *s)
/* unless we're doing keep-alive, we want to quickly close the connection
* to the server.
* XXX cognet: If the connection doesn't have a owner then it may not
* be referenced anywhere, just kill it now, even if it could be reused.
* To be revisited later when revisited later when we handle connection
* pools properly.
*/
if (((s->txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_KAL) ||
!si_conn_ready(&s->si[1]) || !srv_conn->owner) {
@ -3842,8 +3839,12 @@ void http_end_txn_clean_session(struct stream *s)
* We then can call si_release_endpoint() to destroy the conn_stream
*/
if (((s->txn->flags & TX_CON_WANT_MSK) != TX_CON_WANT_KAL) ||
!si_conn_ready(&s->si[1]) || !srv_conn->owner)
!si_conn_ready(&s->si[1]))
srv_conn = NULL;
else if (!srv_conn->owner) {
srv_conn->owner = s->sess;
session_add_conn(s->sess, srv_conn, s->target);
}
si_release_endpoint(&s->si[1]);
s->si[1].state = s->si[1].prev_state = SI_ST_INI;