[master] cac8e85 Give/Move the previous reembark code to HTTP1, and close a narrow race while we're at it.
Poul-Henning Kamp
phk at FreeBSD.org
Mon May 9 23:40:07 CEST 2016
commit cac8e853e896d6d2448977491a4db26dbb1bf915
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon May 9 21:39:17 2016 +0000
Give/Move the previous reembark code to HTTP1, and close a
narrow race while we're at it.
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 15617a7..7f8bebb 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -536,7 +536,6 @@ static void
hsh_rush2(struct worker *wrk, struct rush *r)
{
struct req *req;
- struct sess *sp;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(r, RUSH_MAGIC);
@@ -546,24 +545,8 @@ hsh_rush2(struct worker *wrk, struct rush *r)
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
VTAILQ_REMOVE(&r->reqs, req, w_list);
DSL(DBG_WAITINGLIST, req->vsl->wid, "off waiting list");
- if (req->transport->reembark != NULL) {
- req->transport->reembark(wrk, req);
- continue;
- }
- if (!SES_Reschedule_Req(req))
- continue;
- /* Couldn't schedule, ditch */
- wrk->stats->busy_wakeup--;
- wrk->stats->busy_killed++;
- AN (req->vcl);
- VCL_Rel(&req->vcl);
- sp = req->sp;
- CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
- CNT_AcctLogCharge(wrk->stats, req);
- Req_Release(req);
- SES_Delete(sp, SC_OVERLOAD, NAN);
- DSL(DBG_WAITINGLIST, req->vsl->wid, "kill from waiting list");
- (void)usleep(100000);
+ AN(req->transport->reembark);
+ req->transport->reembark(wrk, req);
}
}
diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index 216dedf..27a5597 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -175,6 +175,31 @@ http1_req_fail(struct req *req, enum sess_close reason)
SES_Close(req->sp, reason);
}
+static void __match_proto__(vtr_reembark_f)
+http1_reembark(struct worker *wrk, struct req *req)
+{
+ struct sess *sp;
+
+ sp = req->sp;
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+
+ http1_setstate(sp, H1BUSY);
+
+ if (!SES_Reschedule_Req(req))
+ return;
+
+ /* Couldn't schedule, ditch */
+ wrk->stats->busy_wakeup--;
+ wrk->stats->busy_killed++;
+ AN (req->vcl);
+ VCL_Rel(&req->vcl);
+ CNT_AcctLogCharge(wrk->stats, req);
+ Req_Release(req);
+ SES_Delete(sp, SC_OVERLOAD, NAN);
+ DSL(DBG_WAITINGLIST, req->vsl->wid, "kill from waiting list");
+ usleep(10000);
+}
+
struct transport HTTP1_transport = {
.name = "HTTP/1",
.magic = TRANSPORT_MAGIC,
@@ -185,6 +210,7 @@ struct transport HTTP1_transport = {
.new_session = http1_new_session,
.sess_panic = http1_sess_panic,
.req_panic = http1_req_panic,
+ .reembark = http1_reembark,
};
/*----------------------------------------------------------------------
@@ -394,10 +420,8 @@ HTTP1_Session(struct worker *wrk, struct req *req)
req->transport = &HTTP1_transport;
req->task.func = http1_req;
req->task.priv = req;
- if (CNT_Request(wrk, req) == REQ_FSM_DISEMBARK) {
- http1_setstate(sp, H1BUSY);
+ if (CNT_Request(wrk, req) == REQ_FSM_DISEMBARK)
return;
- }
req->transport = NULL;
req->task.func = NULL;
req->task.priv = NULL;
More information about the varnish-commit
mailing list