From: phk Date: Fri, 15 Sep 2006 07:37:20 +0000 (+0000) Subject: If after handling a request we find anything in our input buffer, X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57a0c91222cfadc7c5948a2c7bcd3e3c5a46a66a;p=varnish If after handling a request we find anything in our input buffer, don't waste time putting the session on the herder, but go right back and take the next request in the current worker thread. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@982 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- diff --git a/varnish-cache/bin/varnishd/cache_acceptor.c b/varnish-cache/bin/varnishd/cache_acceptor.c index 293fdbf6..68b0a9d3 100644 --- a/varnish-cache/bin/varnishd/cache_acceptor.c +++ b/varnish-cache/bin/varnishd/cache_acceptor.c @@ -158,14 +158,6 @@ vca_return_session(struct sess *sp) CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); AZ(sp->obj); AZ(sp->vcl); - if (sp->fd >= 0) { - VSL(SLT_SessionReuse, sp->fd, "%s %s", sp->addr, sp->port); - sp->t_open = sp->t_end; - if (http_RecvPrepAgain(sp->http)) { - vca_handover(sp, 0); - return; - } - } vca_act->recycle(sp); } diff --git a/varnish-cache/bin/varnishd/cache_center.c b/varnish-cache/bin/varnishd/cache_center.c index 93b6a5af..5317d6b4 100644 --- a/varnish-cache/bin/varnishd/cache_center.c +++ b/varnish-cache/bin/varnishd/cache_center.c @@ -40,6 +40,39 @@ DOT start -> RECV static unsigned xids; +/*-------------------------------------------------------------------- + * The very first request + */ +static int +cnt_again(struct sess *sp) +{ + int i; + + assert(sp->xid == 0); + sp->wrk->idle = sp->t_open.tv_sec; + + if (http_RecvPrepAgain(sp->http)) { + sp->step = STP_RECV; + return (0); + } + do + i = http_RecvSome(sp->fd, sp->http); + while (i == -1); + if (i == 0) { + sp->step = STP_RECV; + return (0); + } + if (i == 1) + vca_close_session(sp, "overflow"); + else if (i == 2) + vca_close_session(sp, "no request"); + else + INCOMPL(); + sp->step = STP_DONE; + return (0); +} + + /*-------------------------------------------------------------------- * We have a refcounted object on the session, now deliver it. * @@ -120,6 +153,23 @@ cnt_done(struct sess *sp) (long)sp->t_end.tv_sec, (long)sp->t_end.tv_nsec, dh, dp, da); + sp->xid = 0; + sp->t_open = sp->t_end; + if (sp->fd > 0) { + VSL(SLT_SessionReuse, sp->fd, "%s %s", sp->addr, sp->port); + + /* If we have anything in the input buffer, start over */ + /* + * XXX: we might even want to do a short timed read (poll) + * XXX: here to see if something is pending in the kernel + */ + + if (sp->http->t < sp->http->v) { + sp->step = STP_AGAIN; + return (0); + } + } + SES_Charge(sp); vca_return_session(sp); return (1); diff --git a/varnish-cache/bin/varnishd/steps.h b/varnish-cache/bin/varnishd/steps.h index eff825a8..4ce97f17 100644 --- a/varnish-cache/bin/varnishd/steps.h +++ b/varnish-cache/bin/varnishd/steps.h @@ -1,5 +1,6 @@ /* $Id$ */ +STEP(again, AGAIN) STEP(first, FIRST) STEP(recv, RECV) STEP(pipe, PIPE)