Hello all, As agreed at VDD today.
Best, Geoff -- ** * * UPLEX - Nils Goroll Systemoptimierung Scheffelstraße 32 22301 Hamburg Tel +49 40 2880 5731 Mob +49 176 636 90917 Fax +49 40 42949753 http://uplex.de
From 7f0a652518420504c4123fc767d1c2686c54d102 Mon Sep 17 00:00:00 2001 From: Geoff Simmons <[email protected]> Date: Fri, 4 Dec 2015 16:08:50 +0100 Subject: [PATCH] director VMODs use a rwlock for mutexing, add_backend() uses a wrlock, all other methods us rdlock --- lib/libvmod_directors/fall_back.c | 2 +- lib/libvmod_directors/round_robin.c | 2 +- lib/libvmod_directors/vdir.c | 23 +++++++++++++++-------- lib/libvmod_directors/vdir.h | 5 +++-- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/libvmod_directors/fall_back.c b/lib/libvmod_directors/fall_back.c index a47aa08..241a675 100644 --- a/lib/libvmod_directors/fall_back.c +++ b/lib/libvmod_directors/fall_back.c @@ -66,7 +66,7 @@ vmod_fallback_resolve(const struct director *dir, struct worker *wrk, CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_FALLBACK_MAGIC); - vdir_lock(rr->vd); + vdir_rdlock(rr->vd); for (u = 0; u < rr->vd->n_backend; u++) { be = rr->vd->backend[u]; CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC); diff --git a/lib/libvmod_directors/round_robin.c b/lib/libvmod_directors/round_robin.c index 3690893..75ca9e4 100644 --- a/lib/libvmod_directors/round_robin.c +++ b/lib/libvmod_directors/round_robin.c @@ -67,7 +67,7 @@ vmod_rr_resolve(const struct director *dir, struct worker *wrk, CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC); - vdir_lock(rr->vd); + vdir_rdlock(rr->vd); for (u = 0; u < rr->vd->n_backend; u++) { rr->nxt %= rr->vd->n_backend; be = rr->vd->backend[rr->nxt]; diff --git a/lib/libvmod_directors/vdir.c b/lib/libvmod_directors/vdir.c index 411df34..09d904a 100644 --- a/lib/libvmod_directors/vdir.c +++ b/lib/libvmod_directors/vdir.c @@ -63,7 +63,7 @@ vdir_new(struct vdir **vdp, const char *name, const char *vcl_name, ALLOC_OBJ(vd, VDIR_MAGIC); AN(vd); *vdp = vd; - AZ(pthread_mutex_init(&vd->mtx, NULL)); + AZ(pthread_rwlock_init(&vd->mtx, NULL)); ALLOC_OBJ(vd->dir, DIRECTOR_MAGIC); AN(vd->dir); @@ -89,7 +89,7 @@ vdir_delete(struct vdir **vdp) free(vd->backend); free(vd->weight); - AZ(pthread_mutex_destroy(&vd->mtx)); + AZ(pthread_rwlock_destroy(&vd->mtx)); free(vd->dir->vcl_name); FREE_OBJ(vd->dir); vbit_destroy(vd->vbm); @@ -97,17 +97,24 @@ vdir_delete(struct vdir **vdp) } void -vdir_lock(struct vdir *vd) +vdir_rdlock(struct vdir *vd) { CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); - AZ(pthread_mutex_lock(&vd->mtx)); + AZ(pthread_rwlock_rdlock(&vd->mtx)); +} + +void +vdir_wrlock(struct vdir *vd) +{ + CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); + AZ(pthread_rwlock_wrlock(&vd->mtx)); } void vdir_unlock(struct vdir *vd) { CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); - AZ(pthread_mutex_unlock(&vd->mtx)); + AZ(pthread_rwlock_unlock(&vd->mtx)); } @@ -118,7 +125,7 @@ vdir_add_backend(struct vdir *vd, VCL_BACKEND be, double weight) CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); AN(be); - vdir_lock(vd); + vdir_wrlock(vd); if (vd->n_backend >= vd->l_backend) vdir_expand(vd, vd->l_backend + 16); assert(vd->n_backend < vd->l_backend); @@ -140,7 +147,7 @@ vdir_any_healthy(struct vdir *vd, const struct busyobj *bo, double *changed) CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC); - vdir_lock(vd); + vdir_rdlock(vd); if (changed != NULL) *changed = 0; for (u = 0; u < vd->n_backend; u++) { @@ -183,7 +190,7 @@ vdir_pick_be(struct vdir *vd, double w) double tw = 0.0; VCL_BACKEND be = NULL; - vdir_lock(vd); + vdir_rdlock(vd); for (u = 0; u < vd->n_backend; u++) { if (vd->backend[u]->healthy(vd->backend[u], NULL, NULL)) { vbit_clr(vd->vbm, u); diff --git a/lib/libvmod_directors/vdir.h b/lib/libvmod_directors/vdir.h index 2e1cfe1..81cc3fa 100644 --- a/lib/libvmod_directors/vdir.h +++ b/lib/libvmod_directors/vdir.h @@ -31,7 +31,7 @@ struct vbitmap; struct vdir { unsigned magic; #define VDIR_MAGIC 0x99f4b726 - pthread_mutex_t mtx; + pthread_rwlock_t mtx; unsigned n_backend; unsigned l_backend; VCL_BACKEND *backend; @@ -44,7 +44,8 @@ struct vdir { void vdir_new(struct vdir **vdp, const char *name, const char *vcl_name, vdi_healthy_f *healthy, vdi_resolve_f *resolve, void *priv); void vdir_delete(struct vdir **vdp); -void vdir_lock(struct vdir *vd); +void vdir_rdlock(struct vdir *vd); +void vdir_wrlock(struct vdir *vd); void vdir_unlock(struct vdir *vd); unsigned vdir_add_backend(struct vdir *, VCL_BACKEND be, double weight); unsigned vdir_any_healthy(struct vdir *, const struct busyobj *, -- 2.1.4
signature.asc
Description: OpenPGP digital signature
_______________________________________________ varnish-dev mailing list [email protected] https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev
