Commit c095a4d4 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make getting a backend connections IP something we ask the director

about, and return NULL if they won't tell us.
parent 9454f7b2
......@@ -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)
......
......@@ -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
......
......@@ -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 *);
......
......@@ -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));
}
/*--------------------------------------------------------------------*/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment