[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