From 19cd2387edd107ad7bd25d78e34595010f7b49b0 Mon Sep 17 00:00:00 2001 From: Nils Goroll Date: Thu, 31 Oct 2024 10:00:03 +0100 Subject: [PATCH] cache_http1_line: Refactor V1L_Open() to return struct v1l * --- bin/varnishd/http1/cache_http1.h | 2 +- bin/varnishd/http1/cache_http1_deliver.c | 23 ++++++++++++++++++----- bin/varnishd/http1/cache_http1_fetch.c | 12 ++++++++---- bin/varnishd/http1/cache_http1_line.c | 17 ++++++----------- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/bin/varnishd/http1/cache_http1.h b/bin/varnishd/http1/cache_http1.h index f758a74c981..8c161d5f54d 100644 --- a/bin/varnishd/http1/cache_http1.h +++ b/bin/varnishd/http1/cache_http1.h @@ -61,7 +61,7 @@ void V1P_Charge(struct req *, const struct v1p_acct *, struct VSC_vbe *); /* cache_http1_line.c */ void V1L_Chunked(const struct worker *w); void V1L_EndChunk(const struct worker *w); -void V1L_Open(struct worker *, struct ws *, int *fd, struct vsl_log *, +struct v1l * V1L_Open(struct ws *, int *fd, struct vsl_log *, vtim_real deadline, unsigned niov); stream_close_t V1L_Flush(const struct worker *w); stream_close_t V1L_Close(struct worker *w, uint64_t *cnt); diff --git a/bin/varnishd/http1/cache_http1_deliver.c b/bin/varnishd/http1/cache_http1_deliver.c index 15bc706b925..6bce2558c22 100644 --- a/bin/varnishd/http1/cache_http1_deliver.c +++ b/bin/varnishd/http1/cache_http1_deliver.c @@ -46,8 +46,10 @@ v1d_error(struct req *req, struct boc *boc, const char *msg) "HTTP/1.1 500 Internal Server Error\r\n" "Server: Varnish\r\n" "Connection: close\r\n\r\n"; + uint64_t bytes; - AZ(req->wrk->v1l); + if (req->wrk->v1l != NULL) + (void) V1L_Close(req->wrk, &bytes); VSLbs(req->vsl, SLT_Error, TOSTRAND(msg)); VSLb(req->vsl, SLT_RespProtocol, "HTTP/1.1"); @@ -71,6 +73,7 @@ V1D_Deliver(struct req *req, struct boc *boc, int sendbody) int err = 0, chunked = 0; stream_close_t sc; uint64_t hdrbytes, bytes; + struct v1l *v1l; CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_ORNULL(boc, BOC_MAGIC); @@ -87,6 +90,20 @@ V1D_Deliver(struct req *req, struct boc *boc, int sendbody) } else if (!http_GetHdr(req->resp, H_Connection, NULL)) http_SetHeader(req->resp, "Connection: keep-alive"); + CHECK_OBJ_NOTNULL(req->wrk, WORKER_MAGIC); + + v1l = V1L_Open(req->wrk->aws, &req->sp->fd, req->vsl, + req->t_prev + SESS_TMO(req->sp, send_timeout), + cache_param->http1_iovs); + + if (v1l == NULL) { + v1d_error(req, boc, "Failure to init v1d (workspace_thread overflow)"); + return; + } + + AZ(req->wrk->v1l); + req->wrk->v1l = v1l; + if (sendbody) { if (!http_GetHdr(req->resp, H_Content_Length, NULL)) { if (req->http->protover == 11) { @@ -115,10 +132,6 @@ V1D_Deliver(struct req *req, struct boc *boc, int sendbody) return; } - V1L_Open(req->wrk, req->wrk->aws, &req->sp->fd, req->vsl, - req->t_prev + SESS_TMO(req->sp, send_timeout), - cache_param->http1_iovs); - if (WS_Overflowed(req->wrk->aws)) { v1d_error(req, boc, "workspace_thread overflow"); return; diff --git a/bin/varnishd/http1/cache_http1_fetch.c b/bin/varnishd/http1/cache_http1_fetch.c index 2f431bd6d08..43df040c15b 100644 --- a/bin/varnishd/http1/cache_http1_fetch.c +++ b/bin/varnishd/http1/cache_http1_fetch.c @@ -72,6 +72,7 @@ V1F_SendReq(struct worker *wrk, struct busyobj *bo, uint64_t *ctr_hdrbytes, struct vdp_ctx vdc[1] = { 0 }; intmax_t cl; const char *err = NULL; + struct v1l *v1l = NULL; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); @@ -100,9 +101,8 @@ V1F_SendReq(struct worker *wrk, struct busyobj *bo, uint64_t *ctr_hdrbytes, if (bo->vdp_filter_list != NULL && VCL_StackVDP(vdc, bo->vcl, bo->vdp_filter_list, NULL, bo)) err = "Failure to push processors"; - else if (V1L_Open(wrk, wrk->aws, htc->rfd, bo->vsl, nan(""), 0), - wrk->v1l == NULL) { - /* ^^^^^^ + else if ((v1l = V1L_Open(wrk->aws, htc->rfd, bo->vsl, nan(""), 0)) == NULL) { + /* ^^^^^^^^ * XXX: need a send_timeout for the backend side * XXX: use cache_param->http1_iovs ? */ @@ -111,8 +111,11 @@ V1F_SendReq(struct worker *wrk, struct busyobj *bo, uint64_t *ctr_hdrbytes, else if (v1f_stackv1l(vdc, bo)) err = "Failure to push V1L"; + AZ(wrk->v1l); + wrk->v1l = v1l; + if (err != NULL) { - if (wrk->v1l != NULL) + if (v1l != NULL) (void) V1L_Close(wrk, &bytes); if (VALID_OBJ(vdc, VDP_CTX_MAGIC)) (void) VDP_Close(vdc, NULL, NULL); @@ -122,6 +125,7 @@ V1F_SendReq(struct worker *wrk, struct busyobj *bo, uint64_t *ctr_hdrbytes, return (-1); } + assert(cl >= -1); if (cl < 0) http_PrintfHeader(hp, "Transfer-Encoding: chunked"); diff --git a/bin/varnishd/http1/cache_http1_line.c b/bin/varnishd/http1/cache_http1_line.c index b1087d1e69d..d18bd6d61f8 100644 --- a/bin/varnishd/http1/cache_http1_line.c +++ b/bin/varnishd/http1/cache_http1_line.c @@ -75,19 +75,16 @@ struct v1l { * otherwise, up to niov */ -void -V1L_Open(struct worker *wrk, struct ws *ws, int *fd, struct vsl_log *vsl, +struct v1l * +V1L_Open(struct ws *ws, int *fd, struct vsl_log *vsl, vtim_real deadline, unsigned niov) { struct v1l *v1l; unsigned u; uintptr_t ws_snap; - CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); - AZ(wrk->v1l); - if (WS_Overflowed(ws)) - return; + return (NULL); if (niov != 0) assert(niov >= 3); @@ -96,7 +93,7 @@ V1L_Open(struct worker *wrk, struct ws *ws, int *fd, struct vsl_log *vsl, v1l = WS_Alloc(ws, sizeof *v1l); if (v1l == NULL) - return; + return (NULL); INIT_OBJ(v1l, V1L_MAGIC); v1l->ws = ws; @@ -107,7 +104,7 @@ V1L_Open(struct worker *wrk, struct ws *ws, int *fd, struct vsl_log *vsl, /* Must have at least 3 in case of chunked encoding */ WS_Release(ws, 0); WS_MarkOverflow(ws); - return; + return (NULL); } if (u > IOV_MAX) u = IOV_MAX; @@ -121,10 +118,8 @@ V1L_Open(struct worker *wrk, struct ws *ws, int *fd, struct vsl_log *vsl, v1l->vsl = vsl; v1l->werr = SC_NULL; - AZ(wrk->v1l); - wrk->v1l = v1l; - WS_Release(ws, u * sizeof(struct iovec)); + return (v1l); } stream_close_t