[master] 87f852e Hand transport->new_session a req instead of sp, they'll all need it.
Poul-Henning Kamp
phk at FreeBSD.org
Wed Feb 10 10:44:26 CET 2016
commit 87f852e175083308e7cecf85fea5e7f9558ced6f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Feb 10 08:23:49 2016 +0000
Hand transport->new_session a req instead of sp, they'll all need it.
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index 2fecb7b..f6d6f82 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -293,6 +293,7 @@ static void __match_proto__(task_func_t)
vca_make_session(struct worker *wrk, void *arg)
{
struct sess *sp;
+ struct req *req;
struct wrk_accept *wa;
struct sockaddr_storage ss;
struct suckaddr *sa;
@@ -305,6 +306,13 @@ vca_make_session(struct worker *wrk, void *arg)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CAST_OBJ_NOTNULL(wa, arg, WRK_ACCEPT_MAGIC);
+ if (VTCP_blocking(wa->acceptsock)) {
+ AZ(close(wa->acceptsock));
+ wrk->stats->sess_drop++; // XXX Better counter ?
+ WS_Release(wrk->aws, 0);
+ return;
+ }
+
/* Turn accepted socket into a session */
AN(wrk->aws->r);
sp = SES_New(wrk->pool);
@@ -364,9 +372,15 @@ vca_make_session(struct worker *wrk, void *arg)
}
vca_tcp_opt_set(sp->fd, 0);
+ 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);
+
sp->transport = wa->acceptlsock->transport;
wrk->task.func = sp->transport->new_session;
- wrk->task.priv = sp;
+ wrk->task.priv = req;
}
/*--------------------------------------------------------------------
diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index 7313101..e201707 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -80,24 +80,10 @@ http1_new_session(struct worker *wrk, void *arg)
struct sess *sp;
struct req *req;
- CAST_OBJ_NOTNULL(sp, arg, SESS_MAGIC);
-
- /*
- * Assume we're going to receive something that will likely
- * involve a request...
- */
- 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);
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CAST_OBJ_NOTNULL(req, arg, REQ_MAGIC);
+ sp = req->sp;
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
sp->sess_step = S_STP_H1NEWREQ;
wrk->task.func = SES_Proto_Req;
@@ -108,11 +94,19 @@ static void __match_proto__(task_func_t)
http1_unwait(struct worker *wrk, void *arg)
{
struct sess *sp;
+ struct req *req;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CAST_OBJ_NOTNULL(sp, arg, SESS_MAGIC);
WS_Release(sp->ws, 0);
- http1_new_session(wrk, arg);
+ 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);
+ sp->sess_step = S_STP_H1NEWREQ;
+ wrk->task.func = SES_Proto_Req;
+ wrk->task.priv = req;
}
const struct transport HTTP1_transport = {
diff --git a/bin/varnishd/proxy/cache_proxy_proto.c b/bin/varnishd/proxy/cache_proxy_proto.c
index 9d1db5b..061d1be 100644
--- a/bin/varnishd/proxy/cache_proxy_proto.c
+++ b/bin/varnishd/proxy/cache_proxy_proto.c
@@ -344,13 +344,9 @@ vpx_new_session(struct worker *wrk, void *arg)
int i;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
- 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);
+ CAST_OBJ_NOTNULL(req, arg, REQ_MAGIC);
+ sp = req->sp;
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
/* Per specification */
assert(sizeof vpx1_sig == 5);
@@ -384,8 +380,7 @@ vpx_new_session(struct worker *wrk, void *arg)
req->htc->pipeline_e = req->htc->rxbuf_e;
SES_RxReInit(req->htc);
sp->transport = &HTTP1_transport;
- req->sp->sess_step = S_STP_H1NEWREQ;
- wrk->task.func = SES_Proto_Req;
+ wrk->task.func = sp->transport->new_session;
wrk->task.priv = req;
}
More information about the varnish-commit
mailing list