MINOR: connection: add a new CO_FL_WANT_DRAIN flag to force drain on close

Sometimes we'd like to do our best to drain pending data before closing
in order to save the peer from risking to receive an RST on close.

This adds a new connection flag CO_FL_WANT_DRAIN that is used to
trigger a call to conn_ctrl_drain() from conn_ctrl_close(), and the
sock_drain() function ignores fd_recv_ready() if this flag is set,
in order to catch latest data. It's not used for now.
This commit is contained in:
Willy Tarreau 2021-10-21 21:31:42 +02:00
parent e6dc7a0129
commit 20b622e04b
3 changed files with 4 additions and 2 deletions

View File

@ -131,7 +131,7 @@ enum {
CO_FL_CTRL_READY = 0x00000100, /* FD was registered, fd_delete() needed */
CO_FL_XPRT_READY = 0x00000200, /* xprt_start() done, xprt can be used */
/* unused : 0x00000400 */
CO_FL_WANT_DRAIN = 0x00000400, /* try to drain pending data when closing */
/* This flag is used by data layers to indicate they had to stop
* receiving data because a buffer was full. The connection handler

View File

@ -174,6 +174,8 @@ static inline void conn_ctrl_init(struct connection *conn)
static inline void conn_ctrl_close(struct connection *conn)
{
if (!conn->xprt && (conn->flags & CO_FL_CTRL_READY)) {
if ((conn->flags & (CO_FL_WANT_DRAIN | CO_FL_SOCK_RD_SH)) == CO_FL_WANT_DRAIN)
conn_ctrl_drain(conn);
conn->flags &= ~CO_FL_CTRL_READY;
if (conn->ctrl->ctrl_close)
conn->ctrl->ctrl_close(conn);

View File

@ -836,7 +836,7 @@ int sock_drain(struct connection *conn)
if (fdtab[fd].state & (FD_POLL_ERR|FD_POLL_HUP))
goto shut;
if (!fd_recv_ready(fd))
if (!(conn->flags & CO_FL_WANT_DRAIN) && !fd_recv_ready(fd))
return 0;
/* no drain function defined, use the generic one */