Commit cac8e853 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Give/Move the previous reembark code to HTTP1, and close a

narrow race while we're at it.
parent f839d558
......@@ -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);
}
}
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment