From b490b4e5ad7e0cbee085f72b2ea2ed1cbeb5ee07 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 15 Dec 2013 16:20:50 +0100 Subject: [PATCH] MAJOR: stream-int: handle the connection reuse in si_connect() This is the best place to reuse a connection. We centralize all connection requests and we're at the best place to know exactly what the current state of the underlying connection is. If the connection is reused, we just enable polling for send() in order to be able to emit the request. --- include/proto/stream_interface.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h index 588b83e16c..938ccc1431 100644 --- a/include/proto/stream_interface.h +++ b/include/proto/stream_interface.h @@ -298,14 +298,22 @@ static inline void si_chk_snd(struct stream_interface *si) static inline int si_connect(struct stream_interface *si) { struct connection *conn = objt_conn(si->end); - int ret; + int ret = SN_ERR_NONE; if (unlikely(!conn || !conn->ctrl || !conn->ctrl->connect)) return SN_ERR_INTERNAL; - ret = conn->ctrl->connect(conn, !channel_is_empty(si->ob), 0); - if (ret != SN_ERR_NONE) - return ret; + if (!conn_ctrl_ready(conn) || !conn_xprt_ready(conn)) { + ret = conn->ctrl->connect(conn, !channel_is_empty(si->ob), 0); + if (ret != SN_ERR_NONE) + return ret; + } + else if (!channel_is_empty(si->ob)) { + /* reuse the existing connection, we'll have to send a + * request there. + */ + conn_data_want_send(conn); + } /* needs src ip/port for logging */ if (si->flags & SI_FL_SRC_ADDR) -- 2.47.3