[master] 7c4dcd662 Simplify h2_deliver() with a WS_VSB
Poul-Henning Kamp
phk at FreeBSD.org
Mon Feb 10 09:45:07 UTC 2020
commit 7c4dcd662736336f4e3c9248a145c46c085f3838
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Feb 10 09:43:27 2020 +0000
Simplify h2_deliver() with a WS_VSB
Note XXX relative to #3202
diff --git a/bin/varnishd/cache/cache_ws.c b/bin/varnishd/cache/cache_ws.c
index 4d2c382db..4553c6abf 100644
--- a/bin/varnishd/cache/cache_ws.c
+++ b/bin/varnishd/cache/cache_ws.c
@@ -365,7 +365,6 @@ WS_VSB_new(struct vsb *vsb, struct ws *ws)
WS_Assert(ws);
u = WS_ReserveAll(ws);
if (WS_Overflowed(ws) || u < 2) {
- WS_MarkOverflow(ws);
/* Create a malloced-buffer VSB, and fail it up front */
AN(VSB_new(vsb, NULL, 2, 0));
VSB_cat(vsb, "XXX");
@@ -390,6 +389,7 @@ WS_VSB_finish(struct vsb *vsb, struct ws *ws, size_t *szp)
return (p);
}
}
+ WS_MarkOverflow(ws);
VSB_delete(vsb);
WS_Release(ws, 0);
if (szp)
diff --git a/bin/varnishd/http2/cache_http2_deliver.c b/bin/varnishd/http2/cache_http2_deliver.c
index c279ec54f..a1cdbf9c1 100644
--- a/bin/varnishd/http2/cache_http2_deliver.c
+++ b/bin/varnishd/http2/cache_http2_deliver.c
@@ -221,7 +221,7 @@ static const uint8_t h2_500_resp[] = {
0x1f, 0x27, 0x07, 'V', 'a', 'r', 'n', 'i', 's', 'h',
};
-static int
+static void
h2_build_headers(struct vsb *resp, struct req *req)
{
unsigned u, l;
@@ -232,14 +232,6 @@ h2_build_headers(struct vsb *resp, struct req *req)
uint8_t buf[6];
ssize_t sz, sz1;
- l = WS_ReserveAll(req->ws);
- if (l < 10) {
- WS_Release(req->ws, 0);
- return (-1);
- }
-
- AN(VSB_new(resp, req->ws->f, l, VSB_FIXEDLEN));
-
l = h2_status(buf, req->resp->status);
VSB_bcat(resp, buf, l);
@@ -281,17 +273,17 @@ h2_build_headers(struct vsb *resp, struct req *req)
h2_enc_len(resp, 7, sz, 0);
VSB_bcat(resp, r, sz);
}
- return (VSB_finish(resp));
}
void v_matchproto_(vtr_deliver_f)
h2_deliver(struct req *req, struct boc *boc, int sendbody)
{
- ssize_t sz;
+ size_t sz;
const char *r;
struct sess *sp;
struct h2_req *r2;
- struct vsb resp;
+ struct vsb resp[1];
+ uintptr_t ss;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_ORNULL(boc, BOC_MAGIC);
@@ -302,9 +294,13 @@ h2_deliver(struct req *req, struct boc *boc, int sendbody)
VSLb(req->vsl, SLT_RespProtocol, "HTTP/2.0");
- if (h2_build_headers(&resp, req)) {
- // We ran out of workspace, return minimal 500
- WS_MarkOverflow(req->ws);
+ ss = WS_Snapshot(req->ws);
+
+ WS_VSB_new(resp, req->ws);
+ h2_build_headers(resp, req);
+ r = WS_VSB_finish(resp, req->ws, &sz);
+
+ if (r == NULL) {
VSLb(req->vsl, SLT_Error, "workspace_client overflow");
VSLb(req->vsl, SLT_RespStatus, "500");
VSLb(req->vsl, SLT_RespReason, "Internal Server Error");
@@ -313,9 +309,6 @@ h2_deliver(struct req *req, struct boc *boc, int sendbody)
r = (const char*)h2_500_resp;
sz = sizeof h2_500_resp;
sendbody = 0;
- } else {
- sz = VSB_len(&resp);
- r = req->ws->f;
}
AZ(req->wrk->v1l);
@@ -328,7 +321,8 @@ h2_deliver(struct req *req, struct boc *boc, int sendbody)
sz, r, &req->acct.resp_hdrbytes);
H2_Send_Rel(r2->h2sess, r2);
- WS_Release(req->ws, 0);
+ if (!WS_Overflowed(req->ws)) // XXX: remove if when #3202 is fixed
+ WS_Reset(req->ws, ss);
/* XXX someone into H2 please add appropriate error handling */
if (sendbody) {
More information about the varnish-commit
mailing list