From 838fb54de6894736e028745ea7eba4e117dde838 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Tue, 20 Feb 2024 08:43:09 +0100 Subject: [PATCH] MINOR: stconn: Add a connection flag to notify sending data are the last ones This flag can be use by endpoints to know the data to send, via .snd_buf callback function are the last ones. It is useful to know a shutdown is pending but it cannot be delivered while sedning data are not consumed. --- include/haproxy/connection-t.h | 1 + src/stconn.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/haproxy/connection-t.h b/include/haproxy/connection-t.h index 00639dd..5adf3cf 100644 --- a/include/haproxy/connection-t.h +++ b/include/haproxy/connection-t.h @@ -278,6 +278,7 @@ enum { enum { CO_SFL_MSG_MORE = 0x0001, /* More data to come afterwards */ CO_SFL_STREAMER = 0x0002, /* Producer is continuously streaming data */ + CO_SFL_LAST_DATA = 0x0003, /* Sent data are the last ones, shutdown is pending */ }; /* mux->shutr() modes */ diff --git a/src/stconn.c b/src/stconn.c index c6515b1..0383e24 100644 --- a/src/stconn.c +++ b/src/stconn.c @@ -1636,6 +1636,9 @@ int sc_conn_send(struct stconn *sc) } } + if ((sc->flags & SC_FL_SHUT_WANTED) && co_data(oc) == c_data(oc)) + send_flag |= CO_SFL_LAST_DATA; + ret = conn->mux->snd_buf(sc, &oc->buf, co_data(oc), send_flag); if (ret > 0) { did_send = 1; @@ -2154,7 +2157,12 @@ int sc_applet_send(struct stconn *sc) BUG_ON(sc_ep_have_ff_data(sc)); if (co_data(oc)) { - ret = appctx_snd_buf(sc, &oc->buf, co_data(oc), 0); + unsigned int send_flag = 0; + + if ((sc->flags & SC_FL_SHUT_WANTED) && co_data(oc) == c_data(oc)) + send_flag |= CO_SFL_LAST_DATA; + + ret = appctx_snd_buf(sc, &oc->buf, co_data(oc), send_flag); if (ret > 0) { did_send = 1; c_rew(oc, ret); -- 1.7.10.4