Skip to content

Commit

Permalink
Add an intersticial struct between vcl and directors
Browse files Browse the repository at this point in the history
  • Loading branch information
bsdphk committed Apr 25, 2018
1 parent e272b23 commit 4f3ed52
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 28 deletions.
6 changes: 4 additions & 2 deletions bin/varnishd/cache/cache_director.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
*
*/

struct vcldir;

typedef unsigned vdi_healthy_f(const struct director *, const struct busyobj *,
double *changed);
/* XXX need a VRT_CTX argument */
Expand Down Expand Up @@ -84,9 +86,9 @@ struct director {

/* Internal Housekeeping fields */

struct vcldir *vdir;

char *cli_name;
VTAILQ_ENTRY(director) vcl_list;
struct vcl *vcl;

unsigned health;
const struct vdi_ahealth *admin_health;
Expand Down
29 changes: 15 additions & 14 deletions bin/varnishd/cache/cache_vcl.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,13 +224,13 @@ vcl_iterdir(struct cli *cli, const char *pat, const struct vcl *vcl,
vcl_be_func *func, void *priv)
{
int i, found = 0;
struct director *d;
struct vcldir *vdir;

VTAILQ_FOREACH(d, &vcl->director_list, vcl_list) {
if (fnmatch(pat, d->cli_name, 0))
VTAILQ_FOREACH(vdir, &vcl->director_list, list) {
if (fnmatch(pat, vdir->dir->cli_name, 0))
continue;
found++;
i = func(cli, d, priv);
i = func(cli, vdir->dir, priv);
if (i < 0)
return (i);
found += i;
Expand Down Expand Up @@ -285,32 +285,33 @@ VCL_IterDirector(struct cli *cli, const char *pat,
static void
vcl_BackendEvent(const struct vcl *vcl, enum vcl_event_e e)
{
struct director *d;
struct vcldir *vdir;

ASSERT_CLI();
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
AZ(vcl->busy);

VTAILQ_FOREACH(d, &vcl->director_list, vcl_list)
VDI_Event(d, e);
VTAILQ_FOREACH(vdir, &vcl->director_list, list)
VDI_Event(vdir->dir, e);
}

static void
vcl_KillBackends(struct vcl *vcl)
{
struct director *d;
struct vcldir *vdir;

CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
AZ(vcl->busy);
assert(VTAILQ_EMPTY(&vcl->ref_list));
while (1) {
d = VTAILQ_FIRST(&vcl->director_list);
if (d == NULL)
vdir = VTAILQ_FIRST(&vcl->director_list);
if (vdir == NULL)
break;
VTAILQ_REMOVE(&vcl->director_list, d, vcl_list);
AN(d->destroy);
REPLACE(d->cli_name, NULL);
d->destroy(d);
VTAILQ_REMOVE(&vcl->director_list, vdir, list);
REPLACE(vdir->dir->cli_name, NULL);
AN(vdir->dir->destroy);
vdir->dir->destroy(vdir->dir);
FREE_OBJ(vdir);
}
}

Expand Down
10 changes: 9 additions & 1 deletion bin/varnishd/cache/cache_vcl.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ struct vfp_filter;

VTAILQ_HEAD(vfp_filter_head, vfp_filter);

struct vcldir {
unsigned magic;
#define VCLDIR_MAGIC 0xbf726c7d
struct director *dir;
struct vcl *vcl;
VTAILQ_ENTRY(vcldir) list;
};

struct vcl {
unsigned magic;
#define VCL_MAGIC 0x214188f2
Expand All @@ -47,7 +55,7 @@ struct vcl {
unsigned discard;
const char *temp;
pthread_rwlock_t temp_rwl;
VTAILQ_HEAD(,director) director_list;
VTAILQ_HEAD(,vcldir) director_list;
VTAILQ_HEAD(,vclref) ref_list;
int nrefs;
struct vcl *label;
Expand Down
32 changes: 21 additions & 11 deletions bin/varnishd/cache/cache_vcl_vrt.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,29 +130,35 @@ VRT_AddDirector(VRT_CTX, struct director *d, const char *vcl_name)
{
struct vsb *vsb;
struct vcl *vcl;
struct vcldir *vdir;

CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
vcl = ctx->vcl;
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
AN(d->destroy);
d->admin_health = VDI_AH_PROBE;

AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
if (vcl->temp == VCL_TEMP_COOLING) {
AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
return (1);
}

d->admin_health = VDI_AH_PROBE;
vsb = VSB_new_auto();
AN(vsb);
VSB_printf(vsb, "%s.%s", VCL_Name(vcl), vcl_name);
AZ(VSB_finish(vsb));
REPLACE((d->cli_name), VSB_data(vsb));
VSB_destroy(&vsb);

AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
if (vcl->temp == VCL_TEMP_COOLING) {
AZ(errno=pthread_rwlock_unlock(&vcl->temp_rwl));
return (1);
}
ALLOC_OBJ(vdir, VCLDIR_MAGIC);
AN(vdir);
vdir->dir = d;
vdir->vcl = vcl;
d->vdir = vdir;

Lck_Lock(&vcl_mtx);
VTAILQ_INSERT_TAIL(&vcl->director_list, d, vcl_list);
d->vcl = vcl;
VTAILQ_INSERT_TAIL(&vcl->director_list, vdir, list);
Lck_Unlock(&vcl_mtx);

if (VCL_WARM(vcl))
Expand All @@ -169,13 +175,16 @@ void
VRT_DelDirector(VRT_CTX, struct director *d)
{
struct vcl *vcl;
struct vcldir *vdir;

(void)ctx;
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
vcl = d->vcl;
vdir = d->vdir;
CHECK_OBJ_NOTNULL(vdir, VCLDIR_MAGIC);
vcl = vdir->vcl;
CHECK_OBJ_NOTNULL(vcl, VCL_MAGIC);
Lck_Lock(&vcl_mtx);
VTAILQ_REMOVE(&vcl->director_list, d, vcl_list);
VTAILQ_REMOVE(&vcl->director_list, vdir, list);
Lck_Unlock(&vcl_mtx);

AZ(errno=pthread_rwlock_rdlock(&vcl->temp_rwl));
Expand All @@ -185,6 +194,7 @@ VRT_DelDirector(VRT_CTX, struct director *d)
AN(d->destroy);
REPLACE(d->cli_name, NULL);
d->destroy(d);
FREE_OBJ(vdir);
}

/*--------------------------------------------------------------------*/
Expand Down

0 comments on commit 4f3ed52

Please sign in to comment.