summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--libglusterfs/src/options.c2
-rw-r--r--libglusterfs/src/xlator.c17
-rw-r--r--libglusterfs/src/xlator.h3
3 files changed, 22 insertions, 0 deletions
diff --git a/libglusterfs/src/options.c b/libglusterfs/src/options.c
index 53bd779861c..a28f3b7ea4f 100644
--- a/libglusterfs/src/options.c
+++ b/libglusterfs/src/options.c
@@ -1107,7 +1107,9 @@ xlator_reconfigure_rec (xlator_t *old_xl, xlator_t *new_xl)
old_THIS = THIS;
THIS = old_xl;
+ xlator_init_lock ();
ret = old_xl->reconfigure (old_xl, new_xl->options);
+ xlator_init_unlock ();
THIS = old_THIS;
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;
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index b11d1a96f32..e28790cc034 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -1048,4 +1048,7 @@ glusterfs_reachable_leaves(xlator_t *base, dict_t *leaves);
int
xlator_subvolume_count (xlator_t *this);
+void xlator_init_lock (void);
+void xlator_init_unlock (void);
+
#endif /* _XLATOR_H */