[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