[MEDIUM] centralize buffer timeout checks at the top of process_session

it's more efficient and easier to check all the timeouts at once and
always rely on the buffer flags than to check them everywhere.
This commit is contained in:
Willy Tarreau 2008-08-17 13:04:25 +02:00
parent 26ed74dadc
commit 507385d0e1

View File

@ -668,6 +668,23 @@ void process_session(struct task *t, int *next)
unsigned int rqf;
unsigned int rpf;
/* check timeout expiration only once and adjust buffer flags
* accordingly.
*/
if (unlikely(tick_is_expired(t->expire, now_ms))) {
if (tick_is_expired(s->req->rex, now_ms))
s->req->flags |= BF_READ_TIMEOUT;
if (tick_is_expired(s->req->wex, now_ms))
s->req->flags |= BF_WRITE_TIMEOUT;
if (tick_is_expired(s->rep->rex, now_ms))
s->rep->flags |= BF_READ_TIMEOUT;
if (tick_is_expired(s->rep->wex, now_ms))
s->rep->flags |= BF_WRITE_TIMEOUT;
}
do {
if (resync & PROCESS_REQ) {
resync &= ~PROCESS_REQ;
@ -3119,9 +3136,8 @@ int process_cli(struct session *t)
goto update_state;
}
/* read timeout */
else if (tick_is_expired(req->rex, now_ms)) {
else if (req->flags & BF_READ_TIMEOUT) {
buffer_shutr(req);
req->flags |= BF_READ_TIMEOUT;
if (!(rep->flags & BF_SHUTW)) {
EV_FD_CLR(t->cli_fd, DIR_RD);
trace_term(t, TT_HTTP_CLI_6);
@ -3146,9 +3162,8 @@ int process_cli(struct session *t)
goto update_state;
}
/* write timeout */
else if (tick_is_expired(rep->wex, now_ms)) {
else if (rep->flags & BF_WRITE_TIMEOUT) {
buffer_shutw(rep);
rep->flags |= BF_WRITE_TIMEOUT;
if (!(req->flags & BF_SHUTR)) {
EV_FD_CLR(t->cli_fd, DIR_WR);
shutdown(t->cli_fd, SHUT_WR);
@ -3296,7 +3311,7 @@ int process_srv(struct session *t)
* already set the connect expiration date to the right
* timeout. We just have to check that it has not expired.
*/
if (!tick_is_expired(req->wex, now_ms))
if (!(req->flags & BF_WRITE_TIMEOUT))
return 0;
/* We will set the queue timer to the time spent, just for
@ -3319,7 +3334,7 @@ int process_srv(struct session *t)
* to any other session to release it and wake us up again.
*/
if (t->pend_pos) {
if (!tick_is_expired(req->wex, now_ms)) {
if (!(req->flags & BF_WRITE_TIMEOUT)) {
return 0;
} else {
/* we've been waiting too long here */
@ -3431,14 +3446,14 @@ int process_srv(struct session *t)
trace_term(t, TT_HTTP_SRV_5);
goto update_state;
}
if (!(req->flags & BF_WRITE_STATUS) && !tick_is_expired(req->wex, now_ms)) {
if (!(req->flags & (BF_WRITE_STATUS | BF_WRITE_TIMEOUT))) {
return 0; /* nothing changed */
}
else if (!(req->flags & BF_WRITE_STATUS) || (req->flags & BF_WRITE_ERROR)) {
/* timeout, asynchronous connect error or first write error */
if (t->flags & SN_CONN_TAR) {
/* We are doing a turn-around waiting for a new connection attempt. */
if (!tick_is_expired(req->wex, now_ms))
if (!(req->flags & BF_WRITE_TIMEOUT))
return 0;
t->flags &= ~SN_CONN_TAR;
}
@ -3649,9 +3664,8 @@ int process_srv(struct session *t)
goto update_state;
}
/* read timeout */
else if (tick_is_expired(rep->rex, now_ms)) {
else if (rep->flags & BF_READ_TIMEOUT) {
buffer_shutr(rep);
rep->flags |= BF_READ_TIMEOUT;
if (!(req->flags & BF_SHUTW)) {
EV_FD_CLR(t->srv_fd, DIR_RD);
trace_term(t, TT_HTTP_SRV_11);
@ -3675,9 +3689,8 @@ int process_srv(struct session *t)
goto update_state;
}
/* write timeout */
else if (tick_is_expired(req->wex, now_ms)) {
else if (req->flags & BF_WRITE_TIMEOUT) {
buffer_shutw(req);
req->flags |= BF_WRITE_TIMEOUT;
if (!(rep->flags & BF_SHUTR)) {
EV_FD_CLR(t->srv_fd, DIR_WR);
shutdown(t->srv_fd, SHUT_WR);