[6.0] bb9d7d6f5 Fetch thread reference count and keep cached request bodies
Reza Naghibi
reza at naghibi.com
Wed Aug 19 13:12:08 UTC 2020
commit bb9d7d6f5c6737998a97d81269341baf7cf96249
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date: Mon Nov 4 11:32:59 2019 +0100
Fetch thread reference count and keep cached request bodies
With this patch fetch threads will for completely cached request bodies
keep a reference to it for the entire duration of the fetch. This extends
the retry window of backend requests with request body beyond the
BOS_REQ_DONE point.
Patch by: Poul-Henning Kamp
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index cb4f1ba79..95d6d97b1 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -403,6 +403,7 @@ struct busyobj {
struct http *bereq0;
struct http *bereq;
struct http *beresp;
+ struct objcore *bereq_body;
struct objcore *stale_oc;
struct objcore *fetch_objcore;
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 9962e1c9e..6381bcfaf 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -246,6 +246,12 @@ vbf_stp_mkbereq(struct worker *wrk, struct busyobj *bo)
if (bo->req->req_body_status == REQ_BODY_NONE) {
bo->req = NULL;
ObjSetState(bo->wrk, bo->fetch_objcore, BOS_REQ_DONE);
+ } else if (bo->req->req_body_status == REQ_BODY_CACHED) {
+ AN(bo->req->body_oc);
+ bo->bereq_body = bo->req->body_oc;
+ HSH_Ref(bo->bereq_body);
+ bo->req = NULL;
+ ObjSetState(bo->wrk, bo->fetch_objcore, BOS_REQ_DONE);
}
return (F_STP_STARTFETCH);
}
@@ -1019,6 +1025,8 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
VCL_TaskLeave(bo->vcl, bo->privs);
http_Teardown(bo->bereq);
http_Teardown(bo->beresp);
+ if (bo->bereq_body != NULL)
+ HSH_DerefObjCore(bo->wrk, &bo->bereq_body, 0);
if (bo->fetch_objcore->boc->state == BOS_FINISHED) {
AZ(bo->fetch_objcore->flags & OC_F_FAILED);
diff --git a/bin/varnishd/http1/cache_http1_fetch.c b/bin/varnishd/http1/cache_http1_fetch.c
index 879115b63..860f5ee4b 100644
--- a/bin/varnishd/http1/cache_http1_fetch.c
+++ b/bin/varnishd/http1/cache_http1_fetch.c
@@ -105,7 +105,14 @@ V1F_SendReq(struct worker *wrk, struct busyobj *bo, uint64_t *ctr_hdrbytes,
/* Deal with any message-body the request might (still) have */
i = 0;
- if (bo->req != NULL &&
+ if (bo->bereq_body != NULL) {
+ if (do_chunked)
+ V1L_Chunked(wrk);
+ (void)ObjIterate(bo->wrk, bo->bereq_body,
+ bo, vbf_iter_req_body, 0);
+ if (do_chunked)
+ V1L_EndChunk(wrk);
+ } else if (bo->req != NULL &&
(bo->req->req_body_status == REQ_BODY_CACHED || !onlycached)) {
if (do_chunked)
V1L_Chunked(wrk);
More information about the varnish-commit
mailing list