[master] b28385e Use struct transport to untangle how we get from acceptor to transport
Poul-Henning Kamp
phk at FreeBSD.org
Tue Feb 9 21:51:21 CET 2016
commit b28385eca0ae9a65aebf4fd387fe322bf4107788
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Feb 9 20:23:44 2016 +0000
Use struct transport to untangle how we get from acceptor to transport
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index fb57436..ed69cf6 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -948,7 +948,7 @@ void SES_Wait(struct sess *sp);
void SES_Delete(struct sess *sp, enum sess_close reason, double now);
void SES_NewPool(struct pool *pp, unsigned pool_no);
int SES_Reschedule_Req(struct req *);
-task_func_t SES_Proto_Sess;
+task_func_t SES_New_Session;
task_func_t SES_Proto_Req;
enum htc_status_e {
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index 6ba8e22..78ff8cc 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -330,7 +330,6 @@ vca_make_session(struct worker *wrk, void *arg)
sp->fd = wa->acceptsock;
wa->acceptsock = -1;
- sp->sess_step = wa->acceptlsock->transport->first_step;
assert(wa->acceptaddrlen <= vsa_suckaddr_len);
SES_Reserve_remote_addr(sp, &sa);
@@ -365,9 +364,7 @@ vca_make_session(struct worker *wrk, void *arg)
}
vca_tcp_opt_set(sp->fd, 0);
- /* SES_Proto_Sess() must be sceduled with reserved WS */
- assert(8 <= WS_Reserve(sp->ws, 8));
- wrk->task.func = SES_Proto_Sess;
+ wrk->task.func = wa->acceptlsock->transport->new_session;
wrk->task.priv = sp;
}
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 34c4374..c3802c6 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -314,12 +314,8 @@ SES_Proto_Req(struct worker *wrk, void *arg)
THR_SetRequest(req);
AZ(wrk->aws->r);
- if (req->sp->sess_step < S_STP_H1_LAST) {
- HTTP1_Session(wrk, req);
- AZ(wrk->v1l);
- } else {
- WRONG("Wrong session step");
- }
+ HTTP1_Session(wrk, req);
+ AZ(wrk->v1l);
WS_Assert(wrk->aws);
THR_SetRequest(NULL);
}
@@ -335,35 +331,44 @@ SES_Proto_Req(struct worker *wrk, void *arg)
*/
void __match_proto__(task_func_t)
-SES_Proto_Sess(struct worker *wrk, void *arg)
+SES_New_Session(struct worker *wrk, void *arg)
{
- struct req *req;
struct sess *sp;
+ struct req *req;
- CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CAST_OBJ_NOTNULL(sp, arg, SESS_MAGIC);
- WS_Release(sp->ws, 0);
/*
* Assume we're going to receive something that will likely
* involve a request...
*/
- (void)VTCP_blocking(sp->fd);
+ if (VTCP_blocking(sp->fd)) {
+ if (errno == ECONNRESET)
+ SES_Close(sp, SC_REM_CLOSE);
+ else
+ SES_Close(sp, SC_TX_ERROR);
+ return;
+ }
req = Req_New(wrk, sp);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
req->htc->fd = sp->fd;
SES_RxInit(req->htc, req->ws,
cache_param->http_req_size, cache_param->http_req_hdr_len);
- if (sp->sess_step < S_STP_H1_LAST) {
- wrk->task.func = SES_Proto_Req;
- wrk->task.priv = req;
- } else if (sp->sess_step < S_STP_PROXY_LAST) {
- wrk->task.func = VPX_Proto_Sess;
- wrk->task.priv = req;
- } else {
- WRONG("Wrong session step");
- }
+ sp->sess_step = S_STP_H1NEWREQ;
+ wrk->task.func = SES_Proto_Req;
+ wrk->task.priv = req;
+}
+
+static void __match_proto__(task_func_t)
+SES_Proto_Sess(struct worker *wrk, void *arg)
+{
+ struct sess *sp;
+
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CAST_OBJ_NOTNULL(sp, arg, SESS_MAGIC);
+ WS_Release(sp->ws, 0);
+ SES_New_Session(wrk, arg);
}
/*--------------------------------------------------------------------
diff --git a/bin/varnishd/cache/cache_transport.h b/bin/varnishd/cache/cache_transport.h
index 888bd3a..04440fc 100644
--- a/bin/varnishd/cache/cache_transport.h
+++ b/bin/varnishd/cache/cache_transport.h
@@ -38,6 +38,8 @@ typedef void vtr_deliver_f (struct req *, struct boc *, int sendbody);
struct transport {
unsigned magic;
#define TRANSPORT_MAGIC 0xf157f32f
+
+ task_func_t *new_session;
+
vtr_deliver_f *deliver;
- enum sess_step first_step;
};
diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index 513875d..71516a0 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -47,7 +47,7 @@
const struct transport HTTP1_transport = {
.magic = TRANSPORT_MAGIC,
.deliver = V1D_Deliver,
- .first_step = S_STP_H1NEWSESS,
+ .new_session = SES_New_Session,
};
/*----------------------------------------------------------------------
@@ -185,17 +185,6 @@ HTTP1_Session(struct worker *wrk, struct req *req)
while (1) {
switch (sp->sess_step) {
- case S_STP_H1NEWSESS:
- if (VTCP_blocking(sp->fd)) {
- if (errno == ECONNRESET)
- SES_Close(sp, SC_REM_CLOSE);
- else
- SES_Close(sp, SC_TX_ERROR);
- AN(Req_Cleanup(sp, wrk, req));
- return;
- }
- sp->sess_step = S_STP_H1NEWREQ;
- break;
case S_STP_H1NEWREQ:
assert(isnan(req->t_prev));
assert(isnan(req->t_req));
diff --git a/bin/varnishd/proxy/cache_proxy_proto.c b/bin/varnishd/proxy/cache_proxy_proto.c
index 8df3d84..c8faa64 100644
--- a/bin/varnishd/proxy/cache_proxy_proto.c
+++ b/bin/varnishd/proxy/cache_proxy_proto.c
@@ -332,8 +332,8 @@ vpx_complete(struct http_conn *htc)
return (HTC_S_MORE);
}
-void __match_proto__(task_func_t)
-VPX_Proto_Sess(struct worker *wrk, void *priv)
+static void __match_proto__(task_func_t)
+vpx_new_session(struct worker *wrk, void *arg)
{
struct req *req;
struct sess *sp;
@@ -342,8 +342,13 @@ VPX_Proto_Sess(struct worker *wrk, void *priv)
int i;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
- CAST_OBJ_NOTNULL(req, priv, REQ_MAGIC);
- sp = req->sp;
+ CAST_OBJ_NOTNULL(sp, arg, SESS_MAGIC);
+ (void)VTCP_blocking(sp->fd); /* XXX redundant ? */
+ req = Req_New(wrk, sp);
+ CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+ req->htc->fd = sp->fd;
+ SES_RxInit(req->htc, req->ws,
+ cache_param->http_req_size, cache_param->http_req_hdr_len);
/* Per specification */
assert(sizeof vpx1_sig == 5);
@@ -383,5 +388,5 @@ VPX_Proto_Sess(struct worker *wrk, void *priv)
const struct transport PROXY_transport = {
.magic = TRANSPORT_MAGIC,
- .first_step = S_STP_PROXYNEWSESS,
+ .new_session = vpx_new_session,
};
diff --git a/include/tbl/steps.h b/include/tbl/steps.h
index 5407615..a2fd654 100644
--- a/include/tbl/steps.h
+++ b/include/tbl/steps.h
@@ -31,15 +31,10 @@
/*lint -save -e525 -e539 */
#ifdef SESS_STEP
-SESS_STEP(h1newsess, H1NEWSESS)
SESS_STEP(h1newreq, H1NEWREQ)
SESS_STEP(h1proc, H1PROC)
SESS_STEP(h1busy, H1BUSY)
SESS_STEP(h1cleanup, H1CLEANUP)
-SESS_STEP(h1_last, H1_LAST)
-
-SESS_STEP(proxynewsess, PROXYNEWSESS)
-SESS_STEP(proxy_last, PROXY_LAST)
#endif
#ifdef REQ_STEP
More information about the varnish-commit
mailing list