[master] c095a4d Make getting a backend connections IP something we ask the director about, and return NULL if they won't tell us.
Poul-Henning Kamp
phk at FreeBSD.org
Wed Feb 25 15:30:15 CET 2015
commit c095a4d45030a961bf2916aa5fda97d743133e0a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Wed Feb 25 14:29:42 2015 +0000
Make getting a backend connections IP something we ask the director
about, and return NULL if they won't tell us.
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 1d97950..6d640b8 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -245,11 +245,27 @@ vbe_dir_getbody(const struct director *d, struct worker *wrk,
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+ CHECK_OBJ_NOTNULL(bo->vfc, VFP_CTX_MAGIC);
+ CHECK_OBJ_NOTNULL(bo->htc, HTTP_CONN_MAGIC);
V1F_Setup_Fetch(bo->vfc, bo->htc);
return (0);
}
+static const struct suckaddr * __match_proto__(vdi_getip_f)
+vbe_dir_getip(const struct director *d, struct worker *wrk,
+ struct busyobj *bo)
+{
+
+ CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+ CHECK_OBJ_NOTNULL(bo->htc, HTTP_CONN_MAGIC);
+ CHECK_OBJ_NOTNULL(bo->htc->vbc, VBC_MAGIC);
+
+ return (bo->htc->vbc->addr);
+}
+
/*--------------------------------------------------------------------*/
static void
@@ -291,6 +307,7 @@ VRT_init_vbe(VRT_CTX, struct director **dp, const struct vrt_backend *vrt)
d->healthy = vbe_dir_healthy;
d->gethdrs = vbe_dir_gethdrs;
d->getbody = vbe_dir_getbody;
+ d->getip = vbe_dir_getip;
d->finish = vbe_dir_finish;
if (vrt->probe != NULL)
diff --git a/bin/varnishd/cache/cache_director.c b/bin/varnishd/cache/cache_director.c
index 9f71aa7..49a0405 100644
--- a/bin/varnishd/cache/cache_director.c
+++ b/bin/varnishd/cache/cache_director.c
@@ -106,6 +106,26 @@ VDI_GetBody(struct worker *wrk, struct busyobj *bo)
return (d->getbody(d, wrk, bo));
}
+/* Get IP number (if any ) -------------------------------------------*/
+
+const struct suckaddr *
+VDI_GetIP(struct worker *wrk, struct busyobj *bo)
+{
+ const struct director *d;
+
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+
+ d = bo->director_resp;
+ CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
+ assert(bo->director_state == DIR_S_HDRS ||
+ bo->director_state == DIR_S_BODY);
+ AZ(d->resolve);
+ if (d->getip == NULL)
+ return (NULL);
+ return (d->getip(d, wrk, bo));
+}
+
/* Finish fetch ------------------------------------------------------*/
void
diff --git a/bin/varnishd/cache/cache_director.h b/bin/varnishd/cache/cache_director.h
index 6744ff1..cf7af4b 100644
--- a/bin/varnishd/cache/cache_director.h
+++ b/bin/varnishd/cache/cache_director.h
@@ -53,6 +53,8 @@ typedef int vdi_gethdrs_f(const struct director *, struct worker *,
struct busyobj *);
typedef int vdi_getbody_f(const struct director *, struct worker *,
struct busyobj *);
+typedef const struct suckaddr *vdi_getip_f(const struct director *,
+ struct worker *, struct busyobj *);
typedef void vdi_finish_f(const struct director *, struct worker *,
struct busyobj *);
@@ -69,6 +71,7 @@ struct director {
vdi_resolve_f *resolve;
vdi_gethdrs_f *gethdrs;
vdi_getbody_f *getbody;
+ vdi_getip_f *getip;
vdi_finish_f *finish;
void *priv;
const void *priv2;
@@ -76,8 +79,10 @@ struct director {
/* cache_director.c */
-int VDI_GetHdr(struct worker *wrk, struct busyobj *bo);
-int VDI_GetBody(struct worker *wrk, struct busyobj *bo);
+int VDI_GetHdr(struct worker *, struct busyobj *);
+int VDI_GetBody(struct worker *, struct busyobj *);
+const struct suckaddr *VDI_GetIP(struct worker *, struct busyobj *);
+
void VDI_Finish(struct worker *wrk, struct busyobj *bo);
int VDI_Http1Pipe(struct req *, struct busyobj *);
diff --git a/bin/varnishd/cache/cache_vrt_var.c b/bin/varnishd/cache/cache_vrt_var.c
index fdfe1de..96bbc65 100644
--- a/bin/varnishd/cache/cache_vrt_var.c
+++ b/bin/varnishd/cache/cache_vrt_var.c
@@ -38,7 +38,6 @@
#include "common/heritage.h"
#include "hash/hash_slinger.h"
-#include "cache_backend.h"
#include "cache_director.h"
#include "vrt.h"
#include "vrt_obj.h"
@@ -317,9 +316,7 @@ VRT_r_beresp_backend_ip(VRT_CTX)
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(ctx->bo, BUSYOBJ_MAGIC);
- if (ctx->bo->htc != NULL && ctx->bo->htc->vbc != NULL)
- return(ctx->bo->htc->vbc->addr);
- return (NULL);
+ return (VDI_GetIP(ctx->bo->wrk, ctx->bo));
}
/*--------------------------------------------------------------------*/
More information about the varnish-commit
mailing list