mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-05-06 17:58:01 +00:00
[MAJOR] session: only check for timeouts when they have just occurred.
It's useless to check for buffer timeouts every time we call process_session() because we already control when we set the flag. So let's check them at the precise moment where the flag is set.
This commit is contained in:
parent
ea38854d34
commit
b67a9b8ca8
@ -567,22 +567,43 @@ struct task *process_session(struct task *t)
|
|||||||
//DPRINTF(stderr, "%s:%d: cs=%d ss=%d(%d) rqf=0x%08x rpf=0x%08x\n", __FUNCTION__, __LINE__,
|
//DPRINTF(stderr, "%s:%d: cs=%d ss=%d(%d) rqf=0x%08x rpf=0x%08x\n", __FUNCTION__, __LINE__,
|
||||||
// s->si[0].state, s->si[1].state, s->si[1].err_type, s->req->flags, s->rep->flags);
|
// s->si[0].state, s->si[1].state, s->si[1].err_type, s->req->flags, s->rep->flags);
|
||||||
|
|
||||||
|
/* This flag must explicitly be set every time */
|
||||||
|
s->req->flags &= ~BF_READ_NOEXP;
|
||||||
|
|
||||||
|
/* Keep a copy of req/rep flags so that we can detect shutdowns */
|
||||||
|
rqf_last = s->req->flags;
|
||||||
|
rpf_last = s->rep->flags;
|
||||||
|
|
||||||
/* 1a: Check for low level timeouts if needed. We just set a flag on
|
/* 1a: Check for low level timeouts if needed. We just set a flag on
|
||||||
* stream interfaces when their timeouts have expired.
|
* stream interfaces when their timeouts have expired.
|
||||||
*/
|
*/
|
||||||
if (unlikely(t->state & TASK_WOKEN_TIMER)) {
|
if (unlikely(t->state & TASK_WOKEN_TIMER)) {
|
||||||
stream_int_check_timeouts(&s->si[0]);
|
stream_int_check_timeouts(&s->si[0]);
|
||||||
stream_int_check_timeouts(&s->si[1]);
|
stream_int_check_timeouts(&s->si[1]);
|
||||||
|
|
||||||
|
/* check buffer timeouts, and close the corresponding stream interfaces
|
||||||
|
* for future reads or writes. Note: this will also concern upper layers
|
||||||
|
* but we do not touch any other flag. We must be careful and correctly
|
||||||
|
* detect state changes when calling them.
|
||||||
|
*/
|
||||||
|
|
||||||
buffer_check_timeouts(s->req);
|
buffer_check_timeouts(s->req);
|
||||||
|
|
||||||
|
if (unlikely((s->req->flags & (BF_SHUTR|BF_READ_TIMEOUT)) == BF_READ_TIMEOUT))
|
||||||
|
s->req->prod->shutr(s->req->prod);
|
||||||
|
|
||||||
|
if (unlikely((s->req->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT))
|
||||||
|
s->req->cons->shutw(s->req->cons);
|
||||||
|
|
||||||
buffer_check_timeouts(s->rep);
|
buffer_check_timeouts(s->rep);
|
||||||
|
|
||||||
|
if (unlikely((s->rep->flags & (BF_SHUTR|BF_READ_TIMEOUT)) == BF_READ_TIMEOUT))
|
||||||
|
s->rep->prod->shutr(s->rep->prod);
|
||||||
|
|
||||||
|
if (unlikely((s->rep->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == BF_WRITE_TIMEOUT))
|
||||||
|
s->rep->cons->shutw(s->rep->cons);
|
||||||
}
|
}
|
||||||
|
|
||||||
s->req->flags &= ~BF_READ_NOEXP;
|
|
||||||
|
|
||||||
/* copy req/rep flags so that we can detect shutdowns */
|
|
||||||
rqf_last = s->req->flags;
|
|
||||||
rpf_last = s->rep->flags;
|
|
||||||
|
|
||||||
/* 1b: check for low-level errors reported at the stream interface.
|
/* 1b: check for low-level errors reported at the stream interface.
|
||||||
* First we check if it's a retryable error (in which case we don't
|
* First we check if it's a retryable error (in which case we don't
|
||||||
* want to tell the buffer). Otherwise we report the error one level
|
* want to tell the buffer). Otherwise we report the error one level
|
||||||
@ -637,50 +658,9 @@ struct task *process_session(struct task *t)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check buffer timeouts, and close the corresponding stream interfaces
|
resync_stream_interface:
|
||||||
* for future reads or writes. Note: this will also concern upper layers
|
|
||||||
* but we do not touch any other flag. We must be careful and correctly
|
|
||||||
* detect state changes when calling them.
|
|
||||||
*/
|
|
||||||
if (unlikely(s->req->flags & (BF_READ_TIMEOUT|BF_WRITE_TIMEOUT))) {
|
|
||||||
if (s->req->flags & BF_READ_TIMEOUT)
|
|
||||||
s->req->prod->shutr(s->req->prod);
|
|
||||||
if (s->req->flags & BF_WRITE_TIMEOUT)
|
|
||||||
s->req->cons->shutw(s->req->cons);
|
|
||||||
DPRINTF(stderr,
|
|
||||||
"[%u] %s:%d: task=%p s=%p, sfl=0x%08x, rq=%p, rp=%p, exp(r,w)=%u,%u rqf=%08x rpf=%08x rql=%d rpl=%d cs=%d ss=%d, cet=0x%x set=0x%x retr=%d\n",
|
|
||||||
now_ms, __FUNCTION__, __LINE__,
|
|
||||||
t,
|
|
||||||
s, s->flags,
|
|
||||||
s->req, s->rep,
|
|
||||||
s->req->rex, s->rep->wex,
|
|
||||||
s->req->flags, s->rep->flags,
|
|
||||||
s->req->l, s->rep->l, s->rep->cons->state, s->req->cons->state,
|
|
||||||
s->rep->cons->err_type, s->req->cons->err_type,
|
|
||||||
s->conn_retries);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unlikely(s->rep->flags & (BF_READ_TIMEOUT|BF_WRITE_TIMEOUT))) {
|
|
||||||
if (s->rep->flags & BF_READ_TIMEOUT)
|
|
||||||
s->rep->prod->shutr(s->rep->prod);
|
|
||||||
if (s->rep->flags & BF_WRITE_TIMEOUT)
|
|
||||||
s->rep->cons->shutw(s->rep->cons);
|
|
||||||
DPRINTF(stderr,
|
|
||||||
"[%u] %s:%d: task=%p s=%p, sfl=0x%08x, rq=%p, rp=%p, exp(r,w)=%u,%u rqf=%08x rpf=%08x rql=%d rpl=%d cs=%d ss=%d, cet=0x%x set=0x%x retr=%d\n",
|
|
||||||
now_ms, __FUNCTION__, __LINE__,
|
|
||||||
t,
|
|
||||||
s, s->flags,
|
|
||||||
s->req, s->rep,
|
|
||||||
s->req->rex, s->rep->wex,
|
|
||||||
s->req->flags, s->rep->flags,
|
|
||||||
s->req->l, s->rep->l, s->rep->cons->state, s->req->cons->state,
|
|
||||||
s->rep->cons->err_type, s->req->cons->err_type,
|
|
||||||
s->conn_retries);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check for connection closure */
|
/* Check for connection closure */
|
||||||
|
|
||||||
resync_stream_interface:
|
|
||||||
DPRINTF(stderr,
|
DPRINTF(stderr,
|
||||||
"[%u] %s:%d: task=%p s=%p, sfl=0x%08x, rq=%p, rp=%p, exp(r,w)=%u,%u rqf=%08x rpf=%08x rql=%d rpl=%d cs=%d ss=%d, cet=0x%x set=0x%x retr=%d\n",
|
"[%u] %s:%d: task=%p s=%p, sfl=0x%08x, rq=%p, rp=%p, exp(r,w)=%u,%u rqf=%08x rpf=%08x rql=%d rpl=%d cs=%d ss=%d, cet=0x%x set=0x%x retr=%d\n",
|
||||||
now_ms, __FUNCTION__, __LINE__,
|
now_ms, __FUNCTION__, __LINE__,
|
||||||
|
Loading…
Reference in New Issue
Block a user