From: Willy Tarreau Date: Sun, 3 Jan 2010 13:38:03 +0000 (+0100) Subject: [OPTIM] http: don't immediately enable reading on request X-Git-Tag: v1.4-dev5~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5e8949cf84352405541358da502998dc57ba533c;p=thirdparty%2Fhaproxy.git [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. --- diff --git a/src/proto_http.c b/src/proto_http.c index 536f35825d..e8fc4afeab 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -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;