[OPTIM] http: don't immediately enable reading on request

If we enable reading of a request immediately after completing
another one, we end up performing small reads until the request
buffer is complete. This takes time and makes it harder to realign
the buffer when needed. Just enable reading when we need to.
This commit is contained in:
Willy Tarreau 2010-01-03 14:38:03 +01:00
parent a95a1f4614
commit 5e8949cf84

View File

@ -2251,6 +2251,7 @@ int http_wait_for_request(struct session *s, struct buffer *req, int an_bit)
buffer_dont_connect(req);
req->flags |= BF_READ_DONTWAIT; /* try to get back here ASAP */
req->flags &= ~BF_DONT_READ;
/* just set the request timeout once at the beginning of the request */
if (!tick_isset(req->analyse_exp))
@ -2800,6 +2801,8 @@ int http_process_req_common(struct session *s, struct buffer *req, int an_bit, s
!(txn->flags & TX_REQ_TE_CHNK) && !txn->req.hdr_content_len &&
(req->cons->state == SI_ST_EST || !(s->be->options & PR_O_ABRT_CLOSE)))
req->flags |= BF_DONT_READ;
else
req->flags &= ~BF_DONT_READ;
/* that's OK for us now, let's move on to next analysers */
return 1;
@ -3500,9 +3503,13 @@ int http_request_forward_body(struct session *s, struct buffer *req, int an_bit)
/* if the request buffer is not empty, it means we're
* about to process another request, so send pending
* data with MSG_MORE to merge TCP packets when possible.
* Also, let's not start reading a small request packet,
* we may prefer to read a larger one later.
*/
if (s->req->l)
if (s->req->l > s->req->send_max) {
s->rep->flags |= BF_EXPECT_MORE;
s->req->flags |= BF_DONT_READ;
}
/* make ->lr point to the first non-forwarded byte */
s->req->lr = s->req->w + s->req->send_max;