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) ...@@ -222,7 +222,7 @@ vca_handover(struct sess *sp, int status)
SES_Delete(sp); SES_Delete(sp);
break; break;
case 1: case 1:
sp->step = STP_RECV; sp->step = STP_START;
WRK_QueueSession(sp); WRK_QueueSession(sp);
break; break;
default: default:
......
...@@ -48,12 +48,12 @@ xDOT page="8.2,11.5" ...@@ -48,12 +48,12 @@ xDOT page="8.2,11.5"
DOT size="7.2,10.5" DOT size="7.2,10.5"
DOT margin="0.5" DOT margin="0.5"
DOT center="1" DOT center="1"
DOT start [ DOT acceptor [
DOT shape=hexagon DOT shape=hexagon
DOT label="Request received" DOT label="Request received"
DOT ] DOT ]
DOT ERROR [shape=plaintext] 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> #include <stdio.h>
...@@ -93,7 +93,7 @@ cnt_again(struct sess *sp) ...@@ -93,7 +93,7 @@ cnt_again(struct sess *sp)
while (i == 0) while (i == 0)
i = HTC_Rx(sp->htc); i = HTC_Rx(sp->htc);
if (i == 1) { if (i == 1) {
sp->step = STP_RECV; sp->step = STP_START;
} else { } else {
vca_close_session(sp, "overflow"); vca_close_session(sp, "overflow");
sp->step = STP_DONE; sp->step = STP_DONE;
...@@ -227,7 +227,7 @@ cnt_done(struct sess *sp) ...@@ -227,7 +227,7 @@ cnt_done(struct sess *sp)
i = HTC_Reinit(sp->htc); i = HTC_Reinit(sp->htc);
if (i == 1) { if (i == 1) {
VSL_stats->sess_pipeline++; VSL_stats->sess_pipeline++;
sp->step = STP_RECV; sp->step = STP_START;
return (0); return (0);
} }
if (Tlen(sp->htc->rxbuf)) { if (Tlen(sp->htc->rxbuf)) {
...@@ -290,6 +290,7 @@ DOT vcl_fetch -> fetch_pass [label="pass"] ...@@ -290,6 +290,7 @@ DOT vcl_fetch -> fetch_pass [label="pass"]
DOT } DOT }
DOT fetch_pass -> deliver DOT fetch_pass -> deliver
DOT vcl_fetch -> deliver [label="insert",style=bold,color=blue,weight=2] 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 vcl_fetch -> errfetch [label="error"]
DOT errfetch [label="ERROR",shape=plaintext] DOT errfetch [label="ERROR",shape=plaintext]
*/ */
...@@ -386,7 +387,7 @@ cnt_first(struct sess *sp) ...@@ -386,7 +387,7 @@ cnt_first(struct sess *sp)
switch (i) { switch (i) {
case 1: case 1:
sp->step = STP_RECV; sp->step = STP_START;
break; break;
case -1: case -1:
vca_close_session(sp, "error"); vca_close_session(sp, "error");
...@@ -700,8 +701,7 @@ cnt_pipe(struct sess *sp) ...@@ -700,8 +701,7 @@ cnt_pipe(struct sess *sp)
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
* RECV * RECV
* We have a complete request, get a VCL reference and dispatch it * We have a complete request, set everything up and start it.
* as instructed by vcl_recv{}
* *
DOT subgraph xcluster_recv { DOT subgraph xcluster_recv {
DOT recv [ DOT recv [
...@@ -719,55 +719,9 @@ DOT recv -> hash [label="lookup",style=bold,color=green,weight=4] ...@@ -719,55 +719,9 @@ DOT recv -> hash [label="lookup",style=bold,color=green,weight=4]
static int static int
cnt_recv(struct sess *sp) cnt_recv(struct sess *sp)
{ {
int done;
AZ(sp->obj); AZ(sp->obj);
AN(sp->vcl);
if (sp->restarts > params->max_restarts) {
sp->step = STP_ERROR;
return (0);
}
if (sp->restarts == 0) {
AZ(sp->vcl);
/* Update stats of various sorts */
VSL_stats->client_req++; /* XXX not locked */
sp->t_req = TIM_real();
sp->wrk->used = sp->t_req;
sp->wrk->acct.req++;
/* Assign XID and log */
sp->xid = ++xids; /* XXX not locked */
WSP(sp, SLT_ReqStart, "%s %s %u", sp->addr, sp->port, sp->xid);
/* Borrow VCL reference from worker thread */
VCL_Refresh(&sp->wrk->vcl);
sp->vcl = sp->wrk->vcl;
sp->wrk->vcl = NULL;
http_Setup(sp->http, sp->ws);
done = http_DissectRequest(sp);
/* Catch request snapshot */
sp->ws_req = WS_Snapshot(sp->ws);
/* Catch original request, before modification */
*sp->http0 = *sp->http;
if (done != 0) {
RES_Error(sp, done, NULL); /* XXX: STP_ERROR ? */
sp->step = STP_DONE;
return (0);
}
sp->doclose = http_DoConnection(sp->http);
/* By default we use the first backend */
AZ(sp->backend);
sp->backend = sp->vcl->backend[0];
CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC);
/* XXX: Handle TRACE & OPTIONS of Max-Forwards = 0 */
}
VCL_recv_method(sp); VCL_recv_method(sp);
...@@ -792,6 +746,65 @@ cnt_recv(struct sess *sp) ...@@ -792,6 +746,65 @@ cnt_recv(struct sess *sp)
} }
} }
/*--------------------------------------------------------------------
* 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();
sp->wrk->used = sp->t_req;
sp->wrk->acct.req++;
/* Assign XID and log */
sp->xid = ++xids; /* XXX not locked */
WSP(sp, SLT_ReqStart, "%s %s %u", sp->addr, sp->port, sp->xid);
/* Borrow VCL reference from worker thread */
VCL_Refresh(&sp->wrk->vcl);
sp->vcl = sp->wrk->vcl;
sp->wrk->vcl = NULL;
http_Setup(sp->http, sp->ws);
done = http_DissectRequest(sp);
/* Catch request snapshot */
sp->ws_req = WS_Snapshot(sp->ws);
/* Catch original request, before modification */
*sp->http0 = *sp->http;
if (done != 0) {
RES_Error(sp, done, NULL); /* XXX: STP_ERROR ? */
sp->step = STP_DONE;
return (0);
}
sp->doclose = http_DoConnection(sp->http);
/* By default we use the first backend */
AZ(sp->backend);
sp->backend = sp->vcl->backend[0];
CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC);
/* XXX: Handle TRACE & OPTIONS of Max-Forwards = 0 */
sp->step = STP_RECV;
return (0);
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
* Central state engine dispatcher. * Central state engine dispatcher.
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
STEP(again, AGAIN) STEP(again, AGAIN)
STEP(first, FIRST) STEP(first, FIRST)
STEP(recv, RECV) STEP(recv, RECV)
STEP(start, START)
STEP(pipe, PIPE) STEP(pipe, PIPE)
STEP(pass, PASS) STEP(pass, PASS)
STEP(lookup, LOOKUP) 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