mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-15 16:04:37 +00:00
MEDIUM: connection: set the socket shutdown flags on socket errors
When we get a hard error from a syscall indicating the socket is dead, it makes sense to set the CO_FL_SOCK_WR_SH and CO_FL_SOCK_RD_SH flags to indicate that the socket may not be used anymore. It will ease the error processing in health checks where the state of socket is very important. We'll also be able to avoid some setsockopt(nolinger) after an error. For now, the rest of the code is not impacted because CO_FL_ERROR is always tested prior to these flags.
This commit is contained in:
parent
7fe45698f5
commit
26f4a04744
@ -438,6 +438,7 @@ int conn_recv_proxy(struct connection *conn, int flag)
|
||||
|
||||
recv_abort:
|
||||
conn->err_code = CO_ER_PRX_ABORT;
|
||||
conn->flags |= CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
goto fail;
|
||||
|
||||
fail:
|
||||
@ -574,6 +575,7 @@ int conn_local_send_proxy(struct connection *conn, unsigned int flag)
|
||||
goto out_wait;
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
conn->flags |= CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
goto out_error;
|
||||
}
|
||||
} while (0);
|
||||
|
@ -625,7 +625,7 @@ int tcp_connect_probe(struct connection *conn)
|
||||
* and disable polling on this FD.
|
||||
*/
|
||||
|
||||
conn->flags |= CO_FL_ERROR;
|
||||
conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
__conn_sock_stop_both(conn);
|
||||
return 0;
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ int raw_sock_to_pipe(struct connection *conn, struct pipe *pipe, unsigned int co
|
||||
|
||||
/* report error on POLL_ERR before connection establishment */
|
||||
if ((fdtab[conn->t.sock.fd].ev & FD_POLL_ERR) && (conn->flags & CO_FL_WAIT_L4_CONN)) {
|
||||
conn->flags |= CO_FL_ERROR;
|
||||
conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
@ -236,7 +236,7 @@ static int raw_sock_to_buf(struct connection *conn, struct buffer *buf, int coun
|
||||
|
||||
/* report error on POLL_ERR before connection establishment */
|
||||
if ((fdtab[conn->t.sock.fd].ev & FD_POLL_ERR) && (conn->flags & CO_FL_WAIT_L4_CONN)) {
|
||||
conn->flags |= CO_FL_ERROR;
|
||||
conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
return done;
|
||||
}
|
||||
}
|
||||
@ -284,7 +284,7 @@ static int raw_sock_to_buf(struct connection *conn, struct buffer *buf, int coun
|
||||
break;
|
||||
}
|
||||
else if (errno != EINTR) {
|
||||
conn->flags |= CO_FL_ERROR;
|
||||
conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -305,7 +305,7 @@ static int raw_sock_to_buf(struct connection *conn, struct buffer *buf, int coun
|
||||
* an error without checking.
|
||||
*/
|
||||
if (unlikely(fdtab[conn->t.sock.fd].ev & FD_POLL_ERR))
|
||||
conn->flags |= CO_FL_ERROR;
|
||||
conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
return done;
|
||||
}
|
||||
|
||||
@ -359,7 +359,7 @@ static int raw_sock_from_buf(struct connection *conn, struct buffer *buf, int fl
|
||||
break;
|
||||
}
|
||||
else if (errno != EINTR) {
|
||||
conn->flags |= CO_FL_ERROR;
|
||||
conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -472,6 +472,7 @@ int conn_si_send_proxy(struct connection *conn, unsigned int flag)
|
||||
goto out_wait;
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
conn->flags |= CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH;
|
||||
goto out_error;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user