summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/xlator.c
diff options
context:
space:
mode:
authorJeff Darcy <jdarcy@redhat.com>2016-12-05 13:01:41 -0500
committerRaghavendra G <rgowdapp@redhat.com>2017-01-05 20:38:49 -0800
commitc6b0adb483c1d0c4922e6d4cb77abfb69d314a8e (patch)
treec35bef5796bbb915486cb7dc53227afb9e366839 /libglusterfs/src/xlator.c
parentf60631904defdaec2f1bae84b3cfd6a3e083cf09 (diff)
libglusterfs: serialize init/reconfigure calls
These functions do not generally "expect" to be called more than once in parallel, and many are likely to misbehave in that case (one case in DHT already). Such parallel calls have not generally happened because there are only a few places where we call these functions, and those have been implicitly serialized until recently. However, recent changes in the epoll layer change that, as does brick multiplexing. Therefore, the serialization is now explicit at the init/reconfigure level. It would be sufficient to serialize calls to a particular translator's init and reconfigure functions, but that would require per-translator locks and a bit more complexity in maintaining/using them. Since there's no clear reason why we would need or want to support a higher level of parallelism, the simpler approach of a global lock should suffice. Change-Id: I26296c2826e91dc00b7f0c2061bcc2964ef90c4c BUG: 1399134 Signed-off-by: Jeff Darcy <jdarcy@redhat.com> Reviewed-on: http://review.gluster.org/16030 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'libglusterfs/src/xlator.c')
-rw-r--r--libglusterfs/src/xlator.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 3c1cde50fa0..2edebc0aec2 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -25,6 +25,21 @@
xl->cbks->fn = default_##fn; \
} while (0)
+pthread_mutex_t xlator_init_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+void
+xlator_init_lock (void)
+{
+ (void) pthread_mutex_lock (&xlator_init_mutex);
+}
+
+
+void
+xlator_init_unlock (void)
+{
+ (void) pthread_mutex_unlock (&xlator_init_mutex);
+}
+
static void
fill_defaults (xlator_t *xl)
@@ -400,7 +415,9 @@ __xlator_init(xlator_t *xl)
old_THIS = THIS;
THIS = xl;
+ xlator_init_lock ();
ret = xl->init (xl);
+ xlator_init_unlock ();
THIS = old_THIS;