From: Willy Tarreau Date: Sun, 8 Mar 2009 18:20:25 +0000 (+0100) Subject: [OPTIM] do not re-check req buffer when only response has changed X-Git-Tag: v1.3.16-rc1~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0be0ef9604fa76965bda5b44e854d67e15aa92ae;p=thirdparty%2Fhaproxy.git [OPTIM] do not re-check req buffer when only response has changed In process_session(), we used to re-run through all the evaluation loop when only the response had changed. Now we carefully check in this order : - changes to the stream interfaces (only SI_ST_DIS) - changes to the request buffer flags - changes to the response buffer flags And we branch to the appropriate section. This saves significant CPU cycles, which is important since process_session() is one of the major CPU eaters. The same changes have been applied to uxst_process_session(). --- diff --git a/src/proto_uxst.c b/src/proto_uxst.c index 6351ef109d..8891149526 100644 --- a/src/proto_uxst.c +++ b/src/proto_uxst.c @@ -770,6 +770,7 @@ struct task *uxst_process_session(struct task *t) * at this point. */ + resync_request: /**** Process layer 7 below ****/ resync = 0; @@ -855,9 +856,14 @@ struct task *uxst_process_session(struct task *t) s->req->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; /* according to benchmarks, it makes sense to resync now */ - if (resync) + if (s->req->prod->state == SI_ST_DIS) goto resync_stream_interface; + if (resync) + goto resync_request; + + resync_response: + resync = 0; /* Analyse response */ if (unlikely(s->rep->flags & BF_HIJACK)) { @@ -935,9 +941,15 @@ struct task *uxst_process_session(struct task *t) s->rep->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; - if (resync) + if (s->req->prod->state == SI_ST_DIS) goto resync_stream_interface; + if (s->req->flags != rqf_last) + goto resync_request; + + if (resync) + goto resync_response; + if (likely(s->rep->cons->state != SI_ST_CLO)) { if (s->rep->cons->state == SI_ST_EST) stream_sock_data_finish(s->rep->cons); diff --git a/src/session.c b/src/session.c index 34ed663a6f..aa29591cbe 100644 --- a/src/session.c +++ b/src/session.c @@ -714,6 +714,7 @@ resync_stream_interface: * at this point. */ + resync_request: /**** Process layer 7 below ****/ resync = 0; @@ -855,9 +856,14 @@ resync_stream_interface: s->req->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; /* according to benchmarks, it makes sense to resync now */ - if (resync) + if (s->req->prod->state == SI_ST_DIS || s->req->cons->state == SI_ST_DIS) goto resync_stream_interface; + if (resync) + goto resync_request; + + resync_response: + resync = 0; /* Analyse response */ @@ -948,9 +954,14 @@ resync_stream_interface: s->rep->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT; - if (resync) + if (s->req->prod->state == SI_ST_DIS || s->req->cons->state == SI_ST_DIS) goto resync_stream_interface; + if (s->req->flags != rqf_last) + goto resync_request; + + if (resync) + goto resync_response; /* This is needed only when debugging is enabled, to indicate * client-side or server-side close. Please note that in the unlikely