r5092 - trunk/varnish-cache/bin/varnishd
phk at varnish-cache.org
phk at varnish-cache.org
Wed Aug 11 17:27:21 CEST 2010
Author: phk
Date: 2010-08-11 17:27:21 +0200 (Wed, 11 Aug 2010)
New Revision: 5092
Modified:
trunk/varnish-cache/bin/varnishd/cache.h
trunk/varnish-cache/bin/varnishd/cache_backend.c
trunk/varnish-cache/bin/varnishd/cache_backend.h
trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c
trunk/varnish-cache/bin/varnishd/cache_backend_poll.c
trunk/varnish-cache/bin/varnishd/cache_dir.c
trunk/varnish-cache/bin/varnishd/cache_vcl.c
Log:
Continue the rototilling of the backend code to fit the finally
decided naming/identity scheme.
Now I just need to get probing working again, will say when it works,
right now s00002.vtc plus likely others fail.
Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h 2010-08-11 13:22:31 UTC (rev 5091)
+++ trunk/varnish-cache/bin/varnishd/cache.h 2010-08-11 15:27:21 UTC (rev 5092)
@@ -453,6 +453,7 @@
#define VBC_MAGIC 0x0c5e6592
VTAILQ_ENTRY(vbc) list;
struct backend *backend;
+ struct vdi_simple *vdis;
int fd;
/* Timeouts */
@@ -472,6 +473,7 @@
extern pthread_t VCA_thread;
/* cache_backend.c */
+void VBE_UseHealth(struct director *vdi);
struct vbc *VDI_GetFd(const struct director *, struct sess *sp);
int VDI_Healthy(double now, const struct director *, uintptr_t target);
Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend.c 2010-08-11 13:22:31 UTC (rev 5091)
+++ trunk/varnish-cache/bin/varnishd/cache_backend.c 2010-08-11 15:27:21 UTC (rev 5092)
@@ -48,12 +48,43 @@
#include "cache_backend.h"
#include "vrt.h"
+/*--------------------------------------------------------------------
+ * The "simple" director really isn't, since thats where all the actual
+ * connections happen. Nontheless, pretend it is simple by sequestering
+ * the directoricity of it under this line.
+ */
+
+struct vdi_simple {
+ unsigned magic;
+#define VDI_SIMPLE_MAGIC 0x476d25b7
+ struct director dir;
+ struct backend *backend;
+ const struct vrt_backend *vrt;
+};
+
+
/*
* List of cached vbcs, used if enabled in params/heritage
*/
static VTAILQ_HEAD(,vbc) vbcs = VTAILQ_HEAD_INITIALIZER(vbcs);
+/*--------------------------------------------------------------------
+ * Create default Host: header for backend request
+ */
+void
+VDI_AddHostHeader(const struct sess *sp)
+{
+ CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ CHECK_OBJ_NOTNULL(sp->wrk->bereq, HTTP_MAGIC);
+ CHECK_OBJ_NOTNULL(sp->vbc, VBC_MAGIC);
+ CHECK_OBJ_NOTNULL(sp->vbc->vdis, VDI_SIMPLE_MAGIC);
+ http_PrintfHeader(sp->wrk, sp->fd, sp->wrk->bereq,
+ "Host: %s", sp->vbc->vdis->vrt->hosthdr);
+}
+
+/*--------------------------------------------------------------------*/
+
/* Private interface from backend_cfg.c */
void
VBE_ReleaseConn(struct vbc *vc)
@@ -85,7 +116,6 @@
dst = params->tmx; \
} while (0)
-
/*--------------------------------------------------------------------
* Attempt to connect to a given addrinfo entry.
*
@@ -97,7 +127,7 @@
static int
vbe_TryConnect(const struct sess *sp, int pf, const struct sockaddr *sa,
- socklen_t salen, const struct backend *bp)
+ socklen_t salen, struct vdi_simple *vs)
{
int s, i, tmo;
double tmod;
@@ -105,12 +135,13 @@
char pbuf1[TCP_PORTBUFSIZE], pbuf2[TCP_PORTBUFSIZE];
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ CHECK_OBJ_NOTNULL(vs, VDI_SIMPLE_MAGIC);
s = socket(pf, SOCK_STREAM, 0);
if (s < 0)
return (s);
- FIND_TMO(connect_timeout, tmod, sp, bp);
+ FIND_TMO(connect_timeout, tmod, sp, vs->vrt);
tmo = (int)(tmod * 1000.0);
@@ -127,7 +158,7 @@
TCP_myname(s, abuf1, sizeof abuf1, pbuf1, sizeof pbuf1);
TCP_name(sa, salen, abuf2, sizeof abuf2, pbuf2, sizeof pbuf2);
WSL(sp->wrk, SLT_BackendOpen, s, "%s %s %s %s %s",
- bp->vcl_name, abuf1, pbuf1, abuf2, pbuf2);
+ vs->backend->vcl_name, abuf1, pbuf1, abuf2, pbuf2);
return (s);
}
@@ -135,10 +166,13 @@
/*--------------------------------------------------------------------*/
static int
-bes_conn_try(const struct sess *sp, struct backend *bp)
+bes_conn_try(const struct sess *sp, struct vdi_simple *vs)
{
int s;
+ struct backend *bp = vs->backend;
+ CHECK_OBJ_NOTNULL(vs, VDI_SIMPLE_MAGIC);
+
Lck_Lock(&bp->mtx);
bp->refcount++;
bp->n_conn++; /* It mostly works */
@@ -150,11 +184,11 @@
/* release lock during stuff that can take a long time */
if (params->prefer_ipv6 && bp->ipv6 != NULL)
- s = vbe_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len, bp);
+ s = vbe_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len, vs);
if (s == -1 && bp->ipv4 != NULL)
- s = vbe_TryConnect(sp, PF_INET, bp->ipv4, bp->ipv4len, bp);
+ s = vbe_TryConnect(sp, PF_INET, bp->ipv4, bp->ipv4len, vs);
if (s == -1 && !params->prefer_ipv6 && bp->ipv6 != NULL)
- s = vbe_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len, bp);
+ s = vbe_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len, vs);
if (s < 0) {
Lck_Lock(&bp->mtx);
@@ -215,7 +249,6 @@
return (vc);
}
-
/*--------------------------------------------------------------------
* It evaluates if a backend is healthy _for_a_specific_object_.
* That means that it relies on sp->objhead. This is mainly for saint-mode,
@@ -228,7 +261,7 @@
*/
static unsigned int
-vbe_Healthy(double now, uintptr_t target, struct backend *backend)
+vbe_Healthy(double now, uintptr_t target, struct vdi_simple *vs, struct backend *backend)
{
struct trouble *tr;
struct trouble *tr2;
@@ -236,6 +269,7 @@
unsigned i = 0, retval;
unsigned int threshold;
+ CHECK_OBJ_NOTNULL(vs, VDI_SIMPLE_MAGIC);
CHECK_OBJ_NOTNULL(backend, BACKEND_MAGIC);
if (!backend->healthy)
@@ -244,10 +278,10 @@
/* VRT/VCC sets threshold to UINT_MAX to mark that it's not
* specified by VCL (thus use param).
*/
- if (backend->saintmode_threshold == UINT_MAX)
+ if (vs->vrt->saintmode_threshold == UINT_MAX)
threshold = params->saintmode_threshold;
else
- threshold = backend->saintmode_threshold;
+ threshold = vs->vrt->saintmode_threshold;
/* Saintmode is disabled */
if (threshold == 0)
@@ -299,11 +333,14 @@
*/
static struct vbc *
-vbe_GetVbe(struct sess *sp, struct backend *bp)
+vbe_GetVbe(struct sess *sp, struct vdi_simple *vs)
{
struct vbc *vc;
+ struct backend *bp;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ CHECK_OBJ_NOTNULL(vs, VDI_SIMPLE_MAGIC);
+ bp = vs->backend;
CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC);
/* first look for vbc's we can recycle */
@@ -324,6 +361,7 @@
VSC_main->backend_reuse += 1;
WSP(sp, SLT_Backend, "%d %s %s",
vc->fd, sp->director->vcl_name, bp->vcl_name);
+ vc->vdis = vs;
return (vc);
}
VSC_main->backend_toolate++;
@@ -331,12 +369,13 @@
VDI_CloseFd(sp);
}
- if (!vbe_Healthy(sp->t_req, (uintptr_t)sp->objhead, bp)) {
+ if (!vbe_Healthy(sp->t_req, (uintptr_t)sp->objhead, vs, bp)) {
VSC_main->backend_unhealthy++;
return (NULL);
}
- if (bp->max_conn > 0 && bp->n_conn >= bp->max_conn) {
+ if (vs->vrt->max_connections > 0 &&
+ bp->n_conn >= vs->vrt->max_connections) {
VSC_main->backend_busy++;
return (NULL);
}
@@ -344,7 +383,7 @@
vc = vbe_NewConn();
assert(vc->fd == -1);
AZ(vc->backend);
- vc->fd = bes_conn_try(sp, bp);
+ vc->fd = bes_conn_try(sp, vs);
if (vc->fd < 0) {
VBE_ReleaseConn(vc);
VSC_main->backend_fail++;
@@ -354,27 +393,17 @@
VSC_main->backend_conn++;
WSP(sp, SLT_Backend, "%d %s %s",
vc->fd, sp->director->vcl_name, bp->vcl_name);
+ vc->vdis = vs;
return (vc);
}
/*--------------------------------------------------------------------
- * The "simple" director really isn't, since thats where all the actual
- * connections happen. Nontheless, pretend it is simple by sequestering
- * the directoricity of it under this line.
- */
-
-struct vdi_simple {
- unsigned magic;
-#define VDI_SIMPLE_MAGIC 0x476d25b7
- struct director dir;
- struct backend *backend;
-};
-
-/* Returns the backend if and only if the this is a simple director.
+ * Returns the backend if and only if the this is a simple director.
* XXX: Needs a better name and possibly needs a better general approach.
* XXX: This is mainly used by the DNS director to fetch the actual backend
* XXX: so it can compare DNS lookups with the actual IP.
*/
+
struct backend *
vdi_get_backend_if_simple(const struct director *d)
{
@@ -385,9 +414,33 @@
if (vs2->magic != VDI_SIMPLE_MAGIC)
return NULL;
CAST_OBJ_NOTNULL(vs, d->priv, VDI_SIMPLE_MAGIC);
- return vs->backend;
+ return (vs->backend);
}
+/*--------------------------------------------------------------------
+ *
+ */
+
+void
+VBE_UseHealth(struct director *vdi)
+{
+ struct vdi_simple *vs;
+
+ ASSERT_CLI();
+
+ if (strcmp(vdi->name, "simple"))
+ return;
+ printf("USE HEALTH %p\n", vdi);
+ CAST_OBJ_NOTNULL(vs, vdi->priv, VDI_SIMPLE_MAGIC);
+ if (vs->vrt->probe == NULL)
+ return;
+ VBP_Start(vs->backend, vs->vrt->probe, vs->vrt->hosthdr);
+}
+
+/*--------------------------------------------------------------------
+ *
+ */
+
static struct vbc *
vdi_simple_getfd(const struct director *d, struct sess *sp)
{
@@ -397,12 +450,12 @@
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(vs, d->priv, VDI_SIMPLE_MAGIC);
- vc = vbe_GetVbe(sp, vs->backend);
+ vc = vbe_GetVbe(sp, vs);
if (vc != NULL) {
FIND_TMO(first_byte_timeout,
- vc->first_byte_timeout, sp, vc->backend);
+ vc->first_byte_timeout, sp, vs->vrt);
FIND_TMO(between_bytes_timeout,
- vc->between_bytes_timeout, sp, vc->backend);
+ vc->between_bytes_timeout, sp, vs->vrt);
}
return (vc);
}
@@ -414,7 +467,7 @@
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(vs, d->priv, VDI_SIMPLE_MAGIC);
- return (vbe_Healthy(now, target, vs->backend));
+ return (vbe_Healthy(now, target, vs, vs->backend));
}
/*lint -e{818} not const-able */
@@ -426,8 +479,8 @@
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(vs, d->priv, VDI_SIMPLE_MAGIC);
+ VBP_Stop(vs->backend, vs->vrt->probe);
VBE_DropRef(vs->backend);
- // vbe_stat_deref(vs->dir.vcl_name);
free(vs->dir.vcl_name);
vs->dir.magic = 0;
FREE_OBJ(vs);
@@ -454,7 +507,11 @@
vs->dir.fini = vdi_simple_fini;
vs->dir.healthy = vdi_simple_healthy;
+ vs->vrt = t;
+
vs->backend = VBE_AddBackend(cli, t);
+ if (vs->backend->probe == NULL)
+ VBP_Start(vs->backend, vs->vrt->probe, vs->vrt->hosthdr);
bp[idx] = &vs->dir;
}
Modified: trunk/varnish-cache/bin/varnishd/cache_backend.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend.h 2010-08-11 13:22:31 UTC (rev 5091)
+++ trunk/varnish-cache/bin/varnishd/cache_backend.h 2010-08-11 15:27:21 UTC (rev 5092)
@@ -117,7 +117,6 @@
int refcount;
struct lock mtx;
- char *hosthdr;
char *vcl_name;
char *ipv4_addr;
char *ipv6_addr;
@@ -136,12 +135,6 @@
VTAILQ_HEAD(, trouble) troublelist;
struct vsc_vbe *vsc;
-
- double connect_timeout;
- double first_byte_timeout;
- double between_bytes_timeout;
- unsigned max_conn;
- unsigned saintmode_threshold;
};
/* cache_backend.c */
@@ -155,10 +148,9 @@
void VBE_DropRefLocked(struct backend *b);
/* cache_backend_poll.c */
-void VBP_Start(struct backend *b, struct vrt_backend_probe const *p);
-void VBP_Stop(struct backend *b);
+void VBP_Start(struct backend *b, struct vrt_backend_probe const *p, const char *hosthdr);
+void VBP_Stop(struct backend *b, struct vrt_backend_probe const *p);
-
/* Init functions for directors */
typedef void dir_init_f(struct cli *, struct director **, int , const void*);
dir_init_f VRT_init_dir_simple;
Modified: trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c 2010-08-11 13:22:31 UTC (rev 5091)
+++ trunk/varnish-cache/bin/varnishd/cache_backend_cfg.c 2010-08-11 15:27:21 UTC (rev 5092)
@@ -56,7 +56,6 @@
*/
static VTAILQ_HEAD(, backend) backends = VTAILQ_HEAD_INITIALIZER(backends);
-
/*--------------------------------------------------------------------
*/
@@ -66,7 +65,6 @@
ASSERT_CLI();
VTAILQ_REMOVE(&backends, b, list);
- free(b->hosthdr);
free(b->ipv4);
free(b->ipv4_addr);
free(b->ipv6);
@@ -122,10 +120,7 @@
vbe->backend = NULL;
VBE_ReleaseConn(vbe);
}
- if (b->probe != NULL)
- VBP_Stop(b);
- else
- VBE_Nuke(b);
+ VBE_Nuke(b);
}
void
@@ -222,14 +217,7 @@
REPLACE(b->ipv4_addr, vb->ipv4_addr);
REPLACE(b->ipv6_addr, vb->ipv6_addr);
REPLACE(b->port, vb->port);
- REPLACE(b->hosthdr, vb->hosthdr);
- b->connect_timeout = vb->connect_timeout;
- b->first_byte_timeout = vb->first_byte_timeout;
- b->between_bytes_timeout = vb->between_bytes_timeout;
- b->max_conn = vb->max_connections;
- b->saintmode_threshold = vb->saintmode_threshold;
-
/*
* Copy over the sockaddrs
*/
@@ -240,13 +228,13 @@
assert(b->ipv4 != NULL || b->ipv6 != NULL);
- VBP_Start(b, vb->probe);
+ b->healthy = 1;
+
VTAILQ_INSERT_TAIL(&backends, b, list);
VSC_main->n_backend++;
return (b);
}
-
/*--------------------------------------------------------------------*/
void
@@ -293,10 +281,9 @@
ASSERT_CLI();
VTAILQ_FOREACH(b, &backends, list) {
CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
- cli_out(cli, "%p %s(%s,%s,:%s) %d %d/%d\n",
+ cli_out(cli, "%p %s(%s,%s,:%s) %d %d\n",
b, b->vcl_name, b->ipv4_addr, b->ipv6_addr, b->port,
- b->refcount,
- b->n_conn, b->max_conn);
+ b->refcount, b->n_conn);
}
}
Modified: trunk/varnish-cache/bin/varnishd/cache_backend_poll.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2010-08-11 13:22:31 UTC (rev 5091)
+++ trunk/varnish-cache/bin/varnishd/cache_backend_poll.c 2010-08-11 15:27:21 UTC (rev 5092)
@@ -57,11 +57,23 @@
/* Default averaging rate, we want something pretty responsive */
#define AVG_RATE 4
+struct vbp_vcl {
+ unsigned magic;
+#define VBP_VCL_MAGIC 0x70829764
+
+ VTAILQ_ENTRY(vbp_vcl) list;
+ const struct vrt_backend_probe *probe;
+ const char *hosthdr;
+};
+
struct vbp_target {
unsigned magic;
#define VBP_TARGET_MAGIC 0x6b7cb656
struct backend *backend;
+ VTAILQ_HEAD( ,vbp_vcl) vcls;
+
+ const struct vrt_backend_probe *probe_cache;
struct vrt_backend_probe probe;
int stop;
char *req;
@@ -86,6 +98,8 @@
static VTAILQ_HEAD(, vbp_target) vbp_list =
VTAILQ_HEAD_INITIALIZER(vbp_list);
+static struct lock vbp_mtx;
+
static const char default_request[] =
"GET / HTTP/1.1\r\n"
"Connection: close\r\n"
@@ -413,27 +427,51 @@
};
/*--------------------------------------------------------------------
- * Start/Stop called from cache_backend_cfg.c
+ * Start/Stop called from cache_backend.c
*/
void
-VBP_Start(struct backend *b, struct vrt_backend_probe const *p)
+VBP_Start(struct backend *b, const struct vrt_backend_probe *p, const char *hosthdr)
{
struct vbp_target *vt;
struct vsb *vsb;
+ struct vbp_vcl *vcl;
+ int startthread = 0;
ASSERT_CLI();
- if (p == NULL) {
- b->healthy = 1;
+ if (p == NULL)
return;
+
+ Lck_Lock(&vbp_mtx);
+ if (b->probe == NULL) {
+ ALLOC_OBJ(vt, VBP_TARGET_MAGIC);
+ XXXAN(vt);
+ VTAILQ_INIT(&vt->vcls);
+ vt->backend = b;
+ startthread = 1;
+ VTAILQ_INSERT_TAIL(&vbp_list, vt, list);
+ } else {
+ vt = b->probe;
}
- ALLOC_OBJ(vt, VBP_TARGET_MAGIC);
- AN(vt);
- vt->backend = b;
- vt->probe = *p;
+ VTAILQ_FOREACH(vcl, &vt->vcls, list)
+ if (vcl->probe == p)
+ break;
+ if (vcl == NULL) {
+ ALLOC_OBJ(vcl, VBP_VCL_MAGIC);
+ XXXAN(vcl);
+ vcl->probe = p;
+ vcl->hosthdr = hosthdr;
+ VTAILQ_INSERT_HEAD(&vt->vcls, vcl, list);
+ } else {
+ VTAILQ_REMOVE(&vt->vcls, vcl, list);
+ VTAILQ_INSERT_HEAD(&vt->vcls, vcl, list);
+ }
+
+ vt->probe = *vcl->probe;
+
p = &vt->probe;
if(p->request != NULL) {
@@ -443,8 +481,8 @@
XXXAN(vsb);
vsb_printf(vsb, "GET %s HTTP/1.1\r\n",
p->url != NULL ? p->url : "/");
- if (b->hosthdr != NULL)
- vsb_printf(vsb, "Host: %s\r\n", b->hosthdr);
+ if (hosthdr != NULL)
+ vsb_printf(vsb, "Host: %s\r\n", hosthdr);
vsb_printf(vsb, "Connection: close\r\n");
vsb_printf(vsb, "\r\n");
vsb_finish(vsb);
@@ -455,25 +493,48 @@
}
vt->req_len = strlen(vt->req);
- b->probe = vt;
-
- VTAILQ_INSERT_TAIL(&vbp_list, vt, list);
-
- AZ(pthread_create(&vt->thread, NULL, vbp_wrk_poll_backend, vt));
+ Lck_Unlock(&vbp_mtx);
+ if (startthread)
+ AZ(pthread_create(&vt->thread, NULL, vbp_wrk_poll_backend, vt));
}
void
-VBP_Stop(struct backend *b)
+VBP_Stop(struct backend *b, struct vrt_backend_probe const *p)
{
struct vbp_target *vt;
+ struct vbp_vcl *vcl;
void *ret;
+ int first;
+ ASSERT_CLI();
+
+ if (p == NULL)
+ return;
+
CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
- ASSERT_CLI();
- if (b->probe == NULL)
+ Lck_Lock(&vbp_mtx);
+ AN(b->probe);
+ vt = b->probe;
+ VTAILQ_FOREACH(vcl, &vt->vcls, list)
+ if (vcl->probe == p)
+ break;
+ AN(vcl);
+ first = (vcl == VTAILQ_FIRST(&vt->vcls));
+ VTAILQ_REMOVE(&vt->vcls, vcl, list);
+ Lck_Unlock(&vbp_mtx);
+
+ FREE_OBJ(vcl);
+ if (!first)
return;
- CHECK_OBJ_NOTNULL(b->probe, VBP_TARGET_MAGIC);
+ vcl = VTAILQ_FIRST(&vt->vcls);
+ if (vcl != NULL) {
+ VBP_Start(b, vcl->probe, vcl->hosthdr);
+ return;
+ }
+
+ /* No more polling for this backend */
+
vt = b->probe;
vt->stop = 1;
@@ -493,5 +554,6 @@
VBP_Init(void)
{
+ Lck_New(&vbp_mtx);
CLI_AddFuncs(debug_cmds);
}
Modified: trunk/varnish-cache/bin/varnishd/cache_dir.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_dir.c 2010-08-11 13:22:31 UTC (rev 5091)
+++ trunk/varnish-cache/bin/varnishd/cache_dir.c 2010-08-11 15:27:21 UTC (rev 5092)
@@ -38,21 +38,6 @@
#include "cache.h"
#include "cache_backend.h"
-/*--------------------------------------------------------------------
- * Create default Host: header for backend request
- */
-void
-VDI_AddHostHeader(const struct sess *sp)
-{
-
- CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
- CHECK_OBJ_NOTNULL(sp->wrk->bereq, HTTP_MAGIC);
- CHECK_OBJ_NOTNULL(sp->vbc, VBC_MAGIC);
- CHECK_OBJ_NOTNULL(sp->vbc->backend, BACKEND_MAGIC);
- http_PrintfHeader(sp->wrk, sp->fd, sp->wrk->bereq,
- "Host: %s", sp->vbc->backend->hosthdr);
-}
-
/* Close a connection ------------------------------------------------*/
void
Modified: trunk/varnish-cache/bin/varnishd/cache_vcl.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_vcl.c 2010-08-11 13:22:31 UTC (rev 5091)
+++ trunk/varnish-cache/bin/varnishd/cache_vcl.c 2010-08-11 15:27:21 UTC (rev 5092)
@@ -290,6 +290,7 @@
ccf_config_use(struct cli *cli, const char * const *av, void *priv)
{
struct vcls *vcl;
+ int i;
(void)av;
(void)priv;
@@ -302,6 +303,10 @@
Lck_Lock(&vcl_mtx);
vcl_active = vcl;
Lck_Unlock(&vcl_mtx);
+
+ /* Tickle this VCL's backends to take over health polling */
+ for(i = 1; i < vcl->conf->ndirector; i++)
+ VBE_UseHealth(vcl->conf->director[i]);
}
/*--------------------------------------------------------------------*/
More information about the varnish-commit
mailing list