[master] 5536f10 Pass VCL_BACKEND->resolve() VRT_CTX

Poul-Henning Kamp phk at FreeBSD.org
Thu Apr 26 08:31:10 UTC 2018


commit 5536f102b677e6b469f191fedab1c4cf51144e2c
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Apr 26 07:03:20 2018 +0000

    Pass VCL_BACKEND->resolve() VRT_CTX

diff --git a/bin/varnishd/cache/cache_director.c b/bin/varnishd/cache/cache_director.c
index 952506f..dca50c3 100644
--- a/bin/varnishd/cache/cache_director.c
+++ b/bin/varnishd/cache/cache_director.c
@@ -40,6 +40,7 @@
 #include "cache_director.h"
 
 #include "vcli_serve.h"
+#include "vcl.h"
 #include "vtim.h"
 
 /* -------------------------------------------------------------------*/
@@ -77,18 +78,29 @@ VDI_Ahealth(const struct director *d)
 /* Resolve director --------------------------------------------------*/
 
 static const struct director *
-vdi_resolve(struct worker *wrk, struct busyobj *bo)
+vdi_resolve(struct busyobj *bo)
 {
 	const struct director *d;
 	const struct director *d2;
+	struct vrt_ctx ctx;
 
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 
+	INIT_OBJ(&ctx, VRT_CTX_MAGIC);
+	ctx.vcl = bo->vcl;
+	ctx.vsl = bo->vsl;
+	ctx.http_bereq = bo->bereq;
+	ctx.http_beresp = bo->beresp;
+	ctx.bo = bo;
+	ctx.sp = bo->sp;
+	ctx.now = bo->t_prev;
+	ctx.ws = bo->ws;
+	ctx.method = VCL_MET_BACKEND_FETCH;	// XXX: Not quite true
+
 	for (d = bo->director_req; d != NULL &&
 	    d->methods->resolve != NULL; d = d2) {
 		CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
-		d2 = d->methods->resolve(d, wrk, bo);
+		d2 = d->methods->resolve(&ctx, d);
 		if (d2 == NULL)
 			VSLb(bo->vsl, SLT_FetchError,
 			    "Director %s returned no backend", d->vcl_name);
@@ -111,7 +123,7 @@ VDI_GetHdr(struct worker *wrk, struct busyobj *bo)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 
-	d = vdi_resolve(wrk, bo);
+	d = vdi_resolve(bo);
 	if (d != NULL) {
 		AN(d->methods->gethdrs);
 		bo->director_state = DIR_S_HDRS;
@@ -194,7 +206,7 @@ VDI_Http1Pipe(struct req *req, struct busyobj *bo)
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 
-	d = vdi_resolve(req->wrk, bo);
+	d = vdi_resolve(bo);
 	if (d == NULL || d->methods->http1pipe == NULL) {
 		VSLb(bo->vsl, SLT_VCL_Error, "Backend does not support pipe");
 		return (SC_TX_ERROR);
diff --git a/bin/varnishd/cache/cache_director.h b/bin/varnishd/cache/cache_director.h
index 6004a09..b6629bd 100644
--- a/bin/varnishd/cache/cache_director.h
+++ b/bin/varnishd/cache/cache_director.h
@@ -41,9 +41,7 @@ struct vcldir;
 
 typedef unsigned vdi_healthy_f(const struct director *, const struct busyobj *,
     double *changed);
-/* XXX need a VRT_CTX argument */
-typedef const struct director *vdi_resolve_f(const struct director *,
-    struct worker *, struct busyobj *);
+typedef VCL_BACKEND vdi_resolve_f(VRT_CTX, VCL_BACKEND);
 typedef int vdi_gethdrs_f(const struct director *, struct worker *,
     struct busyobj *);
 typedef int vdi_getbody_f(const struct director *, struct worker *,
diff --git a/lib/libvmod_directors/fall_back.c b/lib/libvmod_directors/fall_back.c
index 2b7367d..46d1cf0 100644
--- a/lib/libvmod_directors/fall_back.c
+++ b/lib/libvmod_directors/fall_back.c
@@ -56,17 +56,15 @@ vmod_fallback_healthy(const struct director *dir, const struct busyobj *bo,
 	return (vdir_any_healthy(fb->vd, bo, changed));
 }
 
-static const struct director * v_matchproto_(vdi_resolve_f)
-vmod_fallback_resolve(const struct director *dir, struct worker *wrk,
-    struct busyobj *bo)
+static VCL_BACKEND v_matchproto_(vdi_resolve_f)
+vmod_fallback_resolve(VRT_CTX, VCL_BACKEND dir)
 {
 	struct vmod_directors_fallback *fb;
 	unsigned u;
 	VCL_BACKEND be = NULL;
 
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(dir, DIRECTOR_MAGIC);
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CAST_OBJ_NOTNULL(fb, dir->priv, VMOD_DIRECTORS_FALLBACK_MAGIC);
 
 	vdir_wrlock(fb->vd);
@@ -75,7 +73,7 @@ vmod_fallback_resolve(const struct director *dir, struct worker *wrk,
 	for (u = 0; u < fb->vd->n_backend; u++) {
 		be = fb->vd->backend[fb->cur];
 		CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
-		if (be->methods->healthy(be, bo, NULL))
+		if (be->methods->healthy(be, ctx->bo, NULL))
 			break;
 		if (++fb->cur == fb->vd->n_backend)
 			fb->cur = 0;
diff --git a/lib/libvmod_directors/random.c b/lib/libvmod_directors/random.c
index 2fd6a35..cab3f7c 100644
--- a/lib/libvmod_directors/random.c
+++ b/lib/libvmod_directors/random.c
@@ -56,21 +56,19 @@ vmod_random_healthy(const struct director *dir, const struct busyobj *bo,
 	return (vdir_any_healthy(rr->vd, bo, changed));
 }
 
-static const struct director * v_matchproto_(vdi_resolve_f)
-vmod_random_resolve(const struct director *dir, struct worker *wrk,
-    struct busyobj *bo)
+static VCL_BACKEND v_matchproto_(vdi_resolve_f)
+vmod_random_resolve(VRT_CTX, VCL_BACKEND dir)
 {
 	struct vmod_directors_random *rr;
 	VCL_BACKEND be;
 	double r;
 
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(dir, DIRECTOR_MAGIC);
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_RANDOM_MAGIC);
 	r = scalbn(VRND_RandomTestable(), -31);
 	assert(r >= 0 && r < 1.0);
-	be = vdir_pick_be(rr->vd, r, bo);
+	be = vdir_pick_be(rr->vd, r, ctx->bo);
 	return (be);
 }
 
diff --git a/lib/libvmod_directors/round_robin.c b/lib/libvmod_directors/round_robin.c
index 1199abb..adaf0f5 100644
--- a/lib/libvmod_directors/round_robin.c
+++ b/lib/libvmod_directors/round_robin.c
@@ -55,18 +55,16 @@ vmod_rr_healthy(const struct director *dir, const struct busyobj *bo,
 	return (vdir_any_healthy(rr->vd, bo, changed));
 }
 
-static const struct director * v_matchproto_(vdi_resolve_f)
-vmod_rr_resolve(const struct director *dir, struct worker *wrk,
-    struct busyobj *bo)
+static VCL_BACKEND v_matchproto_(vdi_resolve_f)
+vmod_rr_resolve(VRT_CTX, VCL_BACKEND dir)
 {
 	struct vmod_directors_round_robin *rr;
 	unsigned u;
 	VCL_BACKEND be = NULL;
 	unsigned nxt;
 
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(dir, DIRECTOR_MAGIC);
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC);
 	vdir_rdlock(rr->vd);
 	for (u = 0; u < rr->vd->n_backend; u++) {
@@ -74,7 +72,7 @@ vmod_rr_resolve(const struct director *dir, struct worker *wrk,
 		rr->nxt = nxt + 1;
 		be = rr->vd->backend[nxt];
 		CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
-		if (be->methods->healthy(be, bo, NULL))
+		if (be->methods->healthy(be, ctx->bo, NULL))
 			break;
 	}
 	vdir_unlock(rr->vd);
diff --git a/lib/libvmod_directors/vmod_shard.c b/lib/libvmod_directors/vmod_shard.c
index 0a0fd90..563f0a8 100644
--- a/lib/libvmod_directors/vmod_shard.c
+++ b/lib/libvmod_directors/vmod_shard.c
@@ -134,9 +134,7 @@ static unsigned v_matchproto_(vdi_healthy)
 vmod_shard_healthy(const struct director *dir, const struct busyobj *bo,
    double *changed);
 
-static const struct director * v_matchproto_(vdi_resolve_f)
-vmod_shard_resolve(const struct director *dir, struct worker *wrk,
-    struct busyobj *bo);
+static vdi_resolve_f vmod_shard_resolve;
 
 struct vmod_directors_shard {
 	unsigned				magic;
@@ -692,32 +690,17 @@ vmod_shard_healthy(const struct director *dir, const struct busyobj *bo,
 	return (sharddir_any_healthy(vshard->shardd, bo, changed));
 }
 
-static const struct director * v_matchproto_(vdi_resolve_f)
-vmod_shard_resolve(const struct director *dir, struct worker *wrk,
-    struct busyobj *bo)
+static VCL_BACKEND v_matchproto_(vdi_resolve_f)
+vmod_shard_resolve(VRT_CTX, VCL_BACKEND dir)
 {
 	struct vmod_directors_shard *vshard;
 	struct vmod_directors_shard_param pstk[1];
 	const struct vmod_directors_shard_param *pp;
-	struct vrt_ctx ctx[1];
 
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(dir, DIRECTOR_MAGIC);
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 	CAST_OBJ_NOTNULL(vshard, dir->priv, VMOD_SHARD_SHARD_MAGIC);
 
-	// Ref: vcl_call_method()
-	INIT_OBJ(ctx, VRT_CTX_MAGIC);
-	ctx->vsl = bo->vsl;
-	ctx->vcl = bo->vcl;
-	ctx->http_bereq = bo->bereq;
-	ctx->http_beresp = bo->beresp;
-	ctx->bo = bo;
-	ctx->sp = bo->sp;
-	ctx->now = bo->t_prev;
-	ctx->ws = bo->ws;
-	ctx->method	= VCL_MET_BACKEND_FETCH;
-
 	pp = vmod_shard_param_read(ctx, vshard,
 				   vshard->param, pstk, "shard_resolve");
 	if (pp == NULL)


More information about the varnish-commit mailing list