[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