[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