Commit 5a8a6b7d authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Split STP_RECV in two:

STP_START is the initial setup of a viable workerthread:  Dissecting
HTTP, getting vcl reference etc.

STP_RECV is invoking vcl_recv() and following orders.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@2168 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 4dd41763
......@@ -222,7 +222,7 @@ vca_handover(struct sess *sp, int status)
SES_Delete(sp);
break;
case 1:
sp->step = STP_RECV;
sp->step = STP_START;
WRK_QueueSession(sp);
break;
default:
......
......@@ -48,12 +48,12 @@ xDOT page="8.2,11.5"
DOT size="7.2,10.5"
DOT margin="0.5"
DOT center="1"
DOT start [
DOT acceptor [
DOT shape=hexagon
DOT label="Request received"
DOT ]
DOT ERROR [shape=plaintext]
DOT start -> recv [style=bold,color=green,weight=4]
DOT acceptor -> start [style=bold,color=green,weight=4]
*/
#include <stdio.h>
......@@ -93,7 +93,7 @@ cnt_again(struct sess *sp)
while (i == 0)
i = HTC_Rx(sp->htc);
if (i == 1) {
sp->step = STP_RECV;
sp->step = STP_START;
} else {
vca_close_session(sp, "overflow");
sp->step = STP_DONE;
......@@ -227,7 +227,7 @@ cnt_done(struct sess *sp)
i = HTC_Reinit(sp->htc);
if (i == 1) {
VSL_stats->sess_pipeline++;
sp->step = STP_RECV;
sp->step = STP_START;
return (0);
}
if (Tlen(sp->htc->rxbuf)) {
......@@ -290,6 +290,7 @@ DOT vcl_fetch -> fetch_pass [label="pass"]
DOT }
DOT fetch_pass -> deliver
DOT vcl_fetch -> deliver [label="insert",style=bold,color=blue,weight=2]
DOT vcl_fetch -> recv [label="restart"]
DOT vcl_fetch -> errfetch [label="error"]
DOT errfetch [label="ERROR",shape=plaintext]
*/
......@@ -386,7 +387,7 @@ cnt_first(struct sess *sp)
switch (i) {
case 1:
sp->step = STP_RECV;
sp->step = STP_START;
break;
case -1:
vca_close_session(sp, "error");
......@@ -700,8 +701,7 @@ cnt_pipe(struct sess *sp)
/*--------------------------------------------------------------------
* RECV
* We have a complete request, get a VCL reference and dispatch it
* as instructed by vcl_recv{}
* We have a complete request, set everything up and start it.
*
DOT subgraph xcluster_recv {
DOT recv [
......@@ -719,16 +719,50 @@ DOT recv -> hash [label="lookup",style=bold,color=green,weight=4]
static int
cnt_recv(struct sess *sp)
{
int done;
AZ(sp->obj);
AN(sp->vcl);
if (sp->restarts > params->max_restarts) {
VCL_recv_method(sp);
sp->wantbody = (strcmp(sp->http->hd[HTTP_HDR_REQ].b, "HEAD") != 0);
switch(sp->handling) {
case VCL_RET_LOOKUP:
/* XXX: discard req body, if any */
sp->step = STP_LOOKUP;
return (0);
case VCL_RET_PIPE:
sp->step = STP_PIPE;
return (0);
case VCL_RET_PASS:
sp->step = STP_PASS;
return (0);
case VCL_RET_ERROR:
/* XXX: discard req body, if any */
sp->step = STP_ERROR;
return (0);
default:
INCOMPL();
}
if (sp->restarts == 0) {
}
/*--------------------------------------------------------------------
* START
* Handle a request, wherever it came from recv/restart.
*
DOT start [shape=box,label="Dissect request"]
DOT start -> recv
*/
static int
cnt_start(struct sess *sp)
{
int done;
AZ(sp->restarts);
AZ(sp->obj);
AZ(sp->vcl);
/* Update stats of various sorts */
VSL_stats->client_req++; /* XXX not locked */
sp->t_req = TIM_real();
......@@ -767,32 +801,11 @@ cnt_recv(struct sess *sp)
CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC);
/* XXX: Handle TRACE & OPTIONS of Max-Forwards = 0 */
}
VCL_recv_method(sp);
sp->wantbody = (strcmp(sp->http->hd[HTTP_HDR_REQ].b, "HEAD") != 0);
switch(sp->handling) {
case VCL_RET_LOOKUP:
/* XXX: discard req body, if any */
sp->step = STP_LOOKUP;
return (0);
case VCL_RET_PIPE:
sp->step = STP_PIPE;
return (0);
case VCL_RET_PASS:
sp->step = STP_PASS;
return (0);
case VCL_RET_ERROR:
/* XXX: discard req body, if any */
sp->step = STP_ERROR;
sp->step = STP_RECV;
return (0);
default:
INCOMPL();
}
}
/*--------------------------------------------------------------------
* Central state engine dispatcher.
*
......
......@@ -32,6 +32,7 @@
STEP(again, AGAIN)
STEP(first, FIRST)
STEP(recv, RECV)
STEP(start, START)
STEP(pipe, PIPE)
STEP(pass, PASS)
STEP(lookup, LOOKUP)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment