[master] 87f32cb Always release req before calling SES_Delete()

Poul-Henning Kamp phk at varnish-cache.org
Mon Jun 25 10:49:34 CEST 2012


commit 87f32cb739e7cb89babfae5f5943719aa3b1fed4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Jun 25 08:48:04 2012 +0000

    Always release req before calling SES_Delete()
    
    Split SES_Handle() and SES_ScheduleReq().

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 436bd20..646ee9d 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -928,7 +928,7 @@ void SES_Delete(struct sess *sp, const char *reason, double now);
 void SES_Charge(struct worker *, struct req *);
 struct sesspool *SES_NewPool(struct pool *pp, unsigned pool_no);
 void SES_DeletePool(struct sesspool *sp);
-int SES_Schedule(struct sess *sp);
+int SES_ScheduleReq(struct req *);
 void SES_Handle(struct sess *sp, double now);
 struct req *SES_GetReq(struct sess *sp);
 void SES_ReleaseReq(struct req *);
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index 5ea1f48..88eef23 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -207,6 +207,8 @@ cnt_wait(struct sess *sp, struct worker *wrk, struct req *req)
 		}
 	}
 	SES_Charge(wrk, req);
+	AZ(req->vcl);
+	SES_ReleaseReq(req);
 	SES_Delete(sp, why, now);
 	return (1);
 }
@@ -295,6 +297,8 @@ cnt_sess_done(struct sess *sp, struct worker *wrk, struct req *req)
 
 	if (sp->fd < 0) {
 		wrk->stats.sess_closed++;
+		AZ(req->vcl);
+		SES_ReleaseReq(req);
 		SES_Delete(sp, NULL, NAN);
 		return (SESS_DONE_RET_GONE);
 	}
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index a2710dd..abcb4c0 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -469,7 +469,6 @@ 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);
@@ -482,11 +481,9 @@ hsh_rush(struct dstat *ds, struct objhead *oh)
 			break;
 		CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 		AZ(req->wrk);
-		sp = req->sp;
-		CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 		VTAILQ_REMOVE(&wl->list, req, w_list);
-		DSL(0x20, SLT_Debug, sp->vsl_id, "off waiting list");
-		if (SES_Schedule(sp)) {
+		DSL(0x20, SLT_Debug, req->sp->vsl_id, "off waiting list");
+		if (SES_ScheduleReq(req)) {
 			/*
 			 * We could not schedule the session, leave the
 			 * rest on the busy list.
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 49bd3bb..9bf3382 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -169,14 +169,17 @@ SES_pool_accept_task(struct worker *wrk, void *arg)
 }
 
 /*--------------------------------------------------------------------
- * Schedule a session back on a work-thread from its pool
+ * Schedule a request back on a work-thread from its sessions pool
  */
 
 int
-SES_Schedule(struct sess *sp)
+SES_ScheduleReq(struct req *req)
 {
+	struct sess *sp;
 	struct sesspool *pp;
 
+	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+	sp = req->sp;
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	pp = sp->sesspool;
 	CHECK_OBJ_NOTNULL(pp, SESSPOOL_MAGIC);
@@ -188,13 +191,8 @@ SES_Schedule(struct sess *sp)
 	if (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT)) {
 		VSC_C_main->client_drop_late++;
 		sp->t_idle = VTIM_real();
-		if (sp->req != NULL && sp->req->vcl != NULL) {
-			/*
-			 * A session parked on a busy object can come here
-			 * after it wakes up.  Loose the VCL reference.
-			 */
-			VCL_Rel(&sp->req->vcl);
-		}
+		AN (req->vcl);
+		VCL_Rel(&req->vcl);
 		SES_Delete(sp, "dropped", sp->t_idle);
 		return (1);
 	}
@@ -208,10 +206,22 @@ SES_Schedule(struct sess *sp)
 void
 SES_Handle(struct sess *sp, double now)
 {
+	struct sesspool *pp;
 
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	pp = sp->sesspool;
+	CHECK_OBJ_NOTNULL(pp, SESSPOOL_MAGIC);
+	AN(pp->pool);
+	AZ(sp->req);
+	sp->task.func = ses_pool_task;
+	sp->task.priv = sp;
 	sp->sess_step = S_STP_NEWREQ;
 	sp->t_rx = now;
-	(void)SES_Schedule(sp);
+	if (Pool_Task(pp->pool, &sp->task, POOL_QUEUE_FRONT)) {
+		VSC_C_main->client_drop_late++;
+		sp->t_idle = VTIM_real();
+		SES_Delete(sp, "dropped", sp->t_idle);
+	}
 }
 
 /*--------------------------------------------------------------------
@@ -248,6 +258,7 @@ SES_Delete(struct sess *sp, const char *reason, double now)
 	struct sesspool *pp;
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	AZ(sp->req);
 	pp = sp->sesspool;
 	CHECK_OBJ_NOTNULL(pp, SESSPOOL_MAGIC);
 	AN(pp->pool);
@@ -259,11 +270,6 @@ SES_Delete(struct sess *sp, const char *reason, double now)
 	assert(!isnan(sp->t_open));
 	assert(sp->fd < 0);
 
-	if (sp->req != NULL) {
-		AZ(sp->req->vcl);
-		SES_ReleaseReq(sp->req);
-	}
-
 	if (*sp->addr == '\0')
 		strcpy(sp->addr, "-");
 	if (*sp->port == '\0')



More information about the varnish-commit mailing list