[4.0] 29e4a01 If we fail to reschedule from the waiting list, we ditch the entire waiting list in an attempt to recover.

Lasse Karstensen lkarsten at varnish-software.com
Mon Jan 19 16:21:20 CET 2015


commit 29e4a01c5243c5fac87556a5828971685050254b
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Tue Nov 18 11:41:17 2014 +0100

    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 9fbcb4e94942a1bc7ff540f0a475b057a616b1ae)

diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 59e6d94..b666d07 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -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;
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 4ba15b6..f162e8e 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -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));
 }
 
 /*--------------------------------------------------------------------



More information about the varnish-commit mailing list