[prev in list] [next in list] [prev in thread] [next in thread]
List: varnish-dev
Subject: [PATCH] director VMODs use a rwlock for mutexing, add_backend() uses a wrlock, all other methods use
From: Geoff Simmons <geoff () uplex ! de>
Date: 2015-12-04 15:19:41
Message-ID: 5661AF0D.6080708 () uplex ! de
[Download RAW message or body]
[Attachment #2 (multipart/signed)]
[Attachment #4 (multipart/mixed)]
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
["0001-director-VMODs-use-a-rwlock-for-mutexing-add_backend.patch" (text/x-patch)]
From 7f0a652518420504c4123fc767d1c2686c54d102 Mon Sep 17 00:00:00 2001
From: Geoff Simmons <geoff@uplex.de>
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" (application/pgp-signature)]
_______________________________________________
varnish-dev mailing list
varnish-dev@varnish-cache.org
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic