Commit 29e4a01c authored by Martin Blix Grydeland's avatar Martin Blix Grydeland Committed by Lasse Karstensen

If we fail to reschedule from the waiting list, we ditch the entire waiting...

If we fail to reschedule from the waiting list, we ditch the entire waiting list in an attempt to recover.

This also fixes buglet in previous commit which failed to call
CNT_AcctLogCharge()

Fixes: #1629

(cherry picked from commit 9fbcb4e9)
parent eea73f6a
......@@ -520,6 +520,7 @@ hsh_rush(struct dstat *ds, struct objhead *oh)
{
unsigned u;
struct req *req;
struct sess *sp;
struct waitinglist *wl;
CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
......@@ -535,8 +536,29 @@ hsh_rush(struct dstat *ds, struct objhead *oh)
AZ(req->wrk);
VTAILQ_REMOVE(&wl->list, req, w_list);
DSL(DBG_WAITINGLIST, req->vsl->wid, "off waiting list");
if (SES_ScheduleReq(req))
if (SES_ScheduleReq(req)) {
/*
* In case of overloads, we ditch the entire
* waiting list.
*/
while (1) {
AN (req->vcl);
VCL_Rel(&req->vcl);
sp = req->sp;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CNT_AcctLogCharge(ds, req);
SES_ReleaseReq(req);
SES_Delete(sp, SC_OVERLOAD, NAN);
req = VTAILQ_FIRST(&wl->list);
if (req == NULL)
break;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
VTAILQ_REMOVE(&wl->list, req, w_list);
DSL(DBG_WAITINGLIST, req->vsl->wid,
"kill from waiting list");
}
break;
}
}
if (VTAILQ_EMPTY(&wl->list)) {
oh->waitinglist = NULL;
......
......@@ -234,14 +234,7 @@ SES_ScheduleReq(struct req *req)
sp->task.func = ses_req_pool_task;
sp->task.priv = req;
if (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT)) {
AN (req->vcl);
VCL_Rel(&req->vcl);
SES_ReleaseReq(req);
SES_Delete(sp, SC_OVERLOAD, NAN);
return (1);
}
return (0);
return (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT));
}
/*--------------------------------------------------------------------
......
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