[6.0] 8e737d427 Unify the H1/H2 reembark code.
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Wed Oct 31 13:08:08 UTC 2018
commit 8e737d427f6c1d3ab16d4fd7840808cb76cb0c69
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Aug 28 06:41:38 2018 +0000
Unify the H1/H2 reembark code.
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 07447bee6..080a47cbe 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -51,6 +51,34 @@
#include "vsha256.h"
#include "vtim.h"
+/*--------------------------------------------------------------------
+ * Reschedule a request from the waiting list
+ */
+
+int
+CNT_Reembark(struct worker *wrk, struct req *req)
+{
+
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+
+ if (!DO_DEBUG(DBG_FAILRESCHED) &&
+ !SES_Reschedule_Req(req, TASK_QUEUE_REQ))
+ return (0);
+
+ /* Couldn't schedule, ditch */
+ wrk->stats->busy_wakeup--;
+ wrk->stats->busy_killed++;
+ VSLb(req->vsl, SLT_Error, "Fail to reschedule req from waiting list");
+
+ AN(req->ws->r);
+ WS_Release(req->ws, 0);
+ AN(req->hash_objhead);
+ (void)HSH_DerefObjHead(wrk, &req->hash_objhead);
+ AZ(req->hash_objhead);
+ return(-1);
+}
+
/*--------------------------------------------------------------------
* Handle "Expect:" and "Connection:" on incoming request
*/
diff --git a/bin/varnishd/cache/cache_varnishd.h b/bin/varnishd/cache/cache_varnishd.h
index 44cacac36..63f0a2369 100644
--- a/bin/varnishd/cache/cache_varnishd.h
+++ b/bin/varnishd/cache/cache_varnishd.h
@@ -335,6 +335,7 @@ enum req_fsm_nxt {
};
enum req_fsm_nxt CNT_Request(struct worker *, struct req *);
+int CNT_Reembark(struct worker *, struct req *);
/* cache_session.c */
void SES_NewPool(struct pool *, unsigned pool_no);
diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index b0dc5f472..ed3c9c8f4 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -47,7 +47,6 @@
static const char H1NEWREQ[] = "HTTP1::NewReq";
static const char H1PROC[] = "HTTP1::Proc";
-static const char H1BUSY[] = "HTTP1::Busy";
static const char H1CLEANUP[] = "HTTP1::Cleanup";
static void HTTP1_Session(struct worker *, struct req *);
@@ -206,42 +205,19 @@ http1_req_cleanup(struct sess *sp, struct worker *wrk, struct req *req)
* Clean up a req from waiting list which cannot complete
*/
-static void
-http1_cleanup_waiting(struct worker *wrk, struct req *req,
- enum sess_close reason)
-{
- struct sess *sp;
-
- sp = req->sp;
- CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
- AN(req->ws->r);
- WS_Release(req->ws, 0);
- AN(req->hash_objhead);
- (void)HSH_DerefObjHead(wrk, &req->hash_objhead);
- AZ(req->hash_objhead);
- SES_Close(sp, reason);
- AN(http1_req_cleanup(sp, wrk, req));
-}
-
static void v_matchproto_(vtr_reembark_f)
http1_reembark(struct worker *wrk, struct req *req)
{
- struct sess *sp;
- sp = req->sp;
- CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
-
- http1_setstate(sp, H1BUSY);
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+ assert(req->transport == &HTTP1_transport);
- if (!DO_DEBUG(DBG_FAILRESCHED) &&
- !SES_Reschedule_Req(req, TASK_QUEUE_REQ))
+ if (!CNT_Reembark(wrk, req))
return;
- /* Couldn't schedule, ditch */
- wrk->stats->busy_wakeup--;
- wrk->stats->busy_killed++;
- VSLb(req->vsl, SLT_Error, "Fail to reschedule req from waiting list");
- http1_cleanup_waiting(wrk, req, SC_OVERLOAD);
+ SES_Close(req->sp, SC_OVERLOAD);
+ AN(http1_req_cleanup(req->sp, wrk, req));
}
static int v_matchproto_(vtr_minimal_response_f)
@@ -489,17 +465,6 @@ HTTP1_Session(struct worker *wrk, struct req *req)
}
req->req_step = R_STP_TRANSPORT;
http1_setstate(sp, H1PROC);
- } else if (st == H1BUSY) {
- CHECK_OBJ_NOTNULL(req->transport, TRANSPORT_MAGIC);
- /*
- * Return from waitinglist.
- * Check to see if the remote has left.
- */
- if (VTCP_check_hup(sp->fd)) {
- http1_cleanup_waiting(wrk, req, SC_REM_CLOSE);
- return;
- }
- http1_setstate(sp, H1PROC);
} else if (st == H1PROC) {
req->task.func = http1_req;
req->task.priv = req;
diff --git a/bin/varnishd/http2/cache_http2.h b/bin/varnishd/http2/cache_http2.h
index 792fd985a..1c28f99ee 100644
--- a/bin/varnishd/http2/cache_http2.h
+++ b/bin/varnishd/http2/cache_http2.h
@@ -233,7 +233,6 @@ void h2_kill_req(struct worker *, const struct h2_sess *,
int h2_rxframe(struct worker *, struct h2_sess *);
h2_error h2_set_setting(struct h2_sess *, const uint8_t *);
void h2_req_body(struct req*);
-void h2_cleanup_waiting(struct worker *wrk, struct h2_req *r2);
task_func_t h2_do_req;
#ifdef TRANSPORT_MAGIC
vtr_req_fail_f h2_req_fail;
diff --git a/bin/varnishd/http2/cache_http2_proto.c b/bin/varnishd/http2/cache_http2_proto.c
index 7713636c4..644474309 100644
--- a/bin/varnishd/http2/cache_http2_proto.c
+++ b/bin/varnishd/http2/cache_http2_proto.c
@@ -1149,21 +1149,3 @@ h2_rxframe(struct worker *wrk, struct h2_sess *h2)
}
return (h2e ? 0 : 1);
}
-
-void
-h2_cleanup_waiting(struct worker *wrk, struct h2_req *r2)
-{
- CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC);
- CHECK_OBJ_NOTNULL(r2->req, REQ_MAGIC);
- CHECK_OBJ_NOTNULL(r2->h2sess, H2_SESS_MAGIC);
-
- AN(r2->req->ws->r);
- WS_Release(r2->req->ws, 0);
- AN(r2->req->hash_objhead);
- (void)HSH_DerefObjHead(wrk, &r2->req->hash_objhead);
- AZ(r2->req->hash_objhead);
- assert(r2->state == H2_S_CLOS_REM);
- AN(r2->scheduled);
- r2->scheduled = 0;
- r2->h2sess->do_sweep = 1;
-}
diff --git a/bin/varnishd/http2/cache_http2_session.c b/bin/varnishd/http2/cache_http2_session.c
index 40a111754..8788dc45a 100644
--- a/bin/varnishd/http2/cache_http2_session.c
+++ b/bin/varnishd/http2/cache_http2_session.c
@@ -437,26 +437,22 @@ h2_new_session(struct worker *wrk, void *arg)
static void v_matchproto_(vtr_reembark_f)
h2_reembark(struct worker *wrk, struct req *req)
{
- struct sess *sp;
struct h2_req *r2;
- sp = req->sp;
- CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
assert(req->transport == &H2_transport);
- if (!DO_DEBUG(DBG_FAILRESCHED) &&
- !SES_Reschedule_Req(req, TASK_QUEUE_STR))
+ if (!CNT_Reembark(wrk, req))
return;
- /* Couldn't schedule, ditch */
- wrk->stats->busy_wakeup--;
- wrk->stats->busy_killed++;
CAST_OBJ_NOTNULL(r2, req->transport_priv, H2_REQ_MAGIC);
- VSLb(req->vsl, SLT_Error, "Fail to reschedule req from waiting list");
- h2_cleanup_waiting(wrk, r2);
+ assert(r2->state == H2_S_CLOS_REM);
+ AN(r2->scheduled);
+ r2->scheduled = 0;
+ r2->h2sess->do_sweep = 1;
}
-
struct transport H2_transport = {
.name = "H2",
.magic = TRANSPORT_MAGIC,
More information about the varnish-commit
mailing list