From 04603915c048a4d23800452195697838296ee166 Mon Sep 17 00:00:00 2001 From: Nils Goroll Date: Thu, 17 May 2018 08:51:57 +0200 Subject: [PATCH] move logic of VDI_Resolve() to VRT as VRT_DirectorResolve() VDI_Resolve() remains for error handling for calls from VDI_GetHdr() and VDI_Http1Pipe() --- bin/varnishd/cache/cache_director.c | 31 +++++++++++++---------------- bin/varnishd/cache/cache_vcl_vrt.c | 18 +++++++++++++++++ include/vrt.h | 1 + 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/bin/varnishd/cache/cache_director.c b/bin/varnishd/cache/cache_director.c index ed1309db34e..de568c953ff 100644 --- a/bin/varnishd/cache/cache_director.c +++ b/bin/varnishd/cache/cache_director.c @@ -78,28 +78,25 @@ VDI_Ahealth(const struct director *d) static VCL_BACKEND VDI_Resolve(VRT_CTX) { - const struct director *d; - const struct director *d2; + VCL_BACKEND d; struct busyobj *bo; + CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); bo = ctx->bo; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); - CHECK_OBJ_ORNULL(bo->director_req, DIRECTOR_MAGIC); - - for (d = bo->director_req; d != NULL && - d->vdir->methods->resolve != NULL; d = d2) { - CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC); - AN(d->vdir); - d2 = d->vdir->methods->resolve(ctx, d); - if (d2 == NULL) - VSLb(bo->vsl, SLT_FetchError, - "Director %s returned no backend", d->vcl_name); - } - CHECK_OBJ_ORNULL(d, DIRECTOR_MAGIC); - if (d == NULL) + + if (bo->director_req == NULL) { VSLb(bo->vsl, SLT_FetchError, "No backend"); - else - AN(d->vdir); + return (NULL); + } + + d = VRT_DirectorResolve(ctx, bo->director_req); + if (d == NULL) { + VSLb(bo->vsl, SLT_FetchError, + "Director %s returned no backend", + bo->director_req->vcl_name); + return (NULL); + } return (d); } diff --git a/bin/varnishd/cache/cache_vcl_vrt.c b/bin/varnishd/cache/cache_vcl_vrt.c index 149d41d9339..4d2086c61af 100644 --- a/bin/varnishd/cache/cache_vcl_vrt.c +++ b/bin/varnishd/cache/cache_vcl_vrt.c @@ -247,6 +247,24 @@ VRT_DisableDirector(VCL_BACKEND d) /*--------------------------------------------------------------------*/ +VCL_BACKEND +VRT_DirectorResolve(VRT_CTX, VCL_BACKEND d) +{ + VCL_BACKEND d2; + + for (; d != NULL && d->vdir->methods->resolve != NULL; d = d2) { + CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC); + AN(d->vdir); + d2 = d->vdir->methods->resolve(ctx, d); + } + CHECK_OBJ_ORNULL(d, DIRECTOR_MAGIC); + if (d != NULL) + AN(d->vdir); + return (d); +} + +/*--------------------------------------------------------------------*/ + VCL_BACKEND VCL_DefaultDirector(const struct vcl *vcl) { diff --git a/include/vrt.h b/include/vrt.h index 8e8f169b437..29de071ebc6 100644 --- a/include/vrt.h +++ b/include/vrt.h @@ -461,6 +461,7 @@ VCL_BACKEND VRT_AddDirector(VRT_CTX, const struct vdi_methods *, void VRT_SetHealth(VCL_BACKEND d, int health); void VRT_DisableDirector(VCL_BACKEND); void VRT_DelDirector(VCL_BACKEND *); +VCL_BACKEND VRT_DirectorResolve(VRT_CTX, VCL_BACKEND); /* Suckaddr related */ int VRT_VSA_GetPtr(const struct suckaddr *sua, const unsigned char ** dst);