[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