mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-16 08:24:42 +00:00
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:
parent
e6dc7a0129
commit
20b622e04b
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user