[master] 744a5e0 Make h2sess deletion more explicit

Dag Haavi Finstad daghf at varnish-software.com
Fri Mar 9 15:50:07 UTC 2018


commit 744a5e0f52b90aa0142151fe1b86367e797d9c15
Author: Dag Haavi Finstad <daghf at varnish-software.com>
Date:   Fri Mar 9 16:47:15 2018 +0100

    Make h2sess deletion more explicit
    
    Also add a few extra asserts, in an effort to chase down #2591

diff --git a/bin/varnishd/http2/cache_http2_proto.c b/bin/varnishd/http2/cache_http2_proto.c
index 8b61020..e1f02eb 100644
--- a/bin/varnishd/http2/cache_http2_proto.c
+++ b/bin/varnishd/http2/cache_http2_proto.c
@@ -165,8 +165,6 @@ h2_del_req(struct worker *wrk, const struct h2_req *r2)
 {
 	struct h2_sess *h2;
 	struct sess *sp;
-	struct req *req;
-	int r;
 
 	CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC);
 	AZ(r2->scheduled);
@@ -176,22 +174,13 @@ h2_del_req(struct worker *wrk, const struct h2_req *r2)
 	sp = h2->sess;
 	Lck_Lock(&sp->mtx);
 	assert(h2->refcnt > 0);
-	r = --h2->refcnt;
+	--h2->refcnt;
 	/* XXX: PRIORITY reshuffle */
 	VTAILQ_REMOVE(&h2->streams, r2, list);
 	Lck_Unlock(&sp->mtx);
 	AZ(r2->req->ws->r);
 	Req_Cleanup(sp, wrk, r2->req);
 	Req_Release(r2->req);
-	if (r)
-		return;
-	/* All streams gone, including stream #0, clean up */
-	VHT_Fini(h2->dectbl);
-	req = h2->srq;
-	AZ(req->ws->r);
-	Req_Cleanup(sp, wrk, req);
-	Req_Release(req);
-	SES_Delete(sp, SC_RX_JUNK, NAN);
 }
 
 void
diff --git a/bin/varnishd/http2/cache_http2_session.c b/bin/varnishd/http2/cache_http2_session.c
index f2d83b4..917f880 100644
--- a/bin/varnishd/http2/cache_http2_session.c
+++ b/bin/varnishd/http2/cache_http2_session.c
@@ -139,6 +139,25 @@ h2_new_sess(const struct worker *wrk, struct sess *sp, struct req *srq)
 	return (h2);
 }
 
+static void
+h2_del_sess(struct worker *wrk, struct h2_sess *h2, enum sess_close reason)
+{
+	struct sess *sp;
+	struct req *req;
+
+	CHECK_OBJ_NOTNULL(h2, H2_SESS_MAGIC);
+	AZ(h2->refcnt);
+	assert(VTAILQ_EMPTY(&h2->streams));
+
+	VHT_Fini(h2->dectbl);
+	req = h2->srq;
+	AZ(req->ws->r);
+	sp = h2->sess;
+	Req_Cleanup(sp, wrk, req);
+	Req_Release(req);
+	SES_Delete(sp, reason, NAN);
+}
+
 /**********************************************************************/
 
 enum htc_status_e v_matchproto_(htc_complete_f)
@@ -320,7 +339,9 @@ h2_new_session(struct worker *wrk, void *arg)
 	h2->req0 = h2_new_req(wrk, h2, 0, NULL);
 
 	if (req->err_code == H2_OU_MARKER && !h2_ou_session(wrk, h2, req)) {
+		assert(h2->refcnt == 1);
 		h2_del_req(wrk, h2->req0);
+		h2_del_sess(wrk, h2, SC_RX_JUNK);
 		return;
 	}
 	assert(HTC_S_COMPLETE == H2_prism_complete(h2->htc));
@@ -387,7 +408,10 @@ h2_new_session(struct worker *wrk, void *arg)
 		Lck_Unlock(&h2->sess->mtx);
 	}
 	h2->cond = NULL;
+	assert(h2->refcnt == 1);
 	h2_del_req(wrk, h2->req0);
+	/* TODO: proper sess close reason */
+	h2_del_sess(wrk, h2, SC_RX_JUNK);
 }
 
 static void v_matchproto_(vtr_reembark_f)


More information about the varnish-commit mailing list