diff options
author | Kaushal M <kaushal@redhat.com> | 2014-05-07 18:17:11 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2014-06-08 07:50:18 -0700 |
commit | 4977a4d74f14d84f9e622a650f1ea9b47d795962 (patch) | |
tree | fef14f93174b8d1881557932bae798a4cae85e57 /xlators/mgmt/glusterd/src/glusterd.c | |
parent | 587bd2b4b7b7076dd469cabf9b8ccf77fca87cfc (diff) |
glusterd: On gaining quorum spawn_daemons in new thread
Backport of http://review.gluster.org/7703 from master
During startup, if a glusterd has peers, it waits till quorum is
obtained to spawn bricks and other services. If peers are not present,
the daemons are started during glusterd' startup itself.
The spawning of daemons as a quorum action was done without using a
seperate thread, unlike the spawn on startup. Since, quotad was launched
using the blocking runner_run api, this leads to the thread being
blocked. The calling thread is almost always the epoll thread and this
leads to a deadlock. The runner_run call blocks the epoll thread waiting
for quotad to start, as a result glusterd cannot serve any requests. But
the startup of quotad is blocked as it cannot fetch the volfile from
glusterd.
The fix for this is to launch the spawn daemons task in a seperate
thread. This will free up the epoll thread and prevents the above
deadlock from happening.
BUG: 1105188
Change-Id: Idad1e96fbe1411dfd4b1a542fb5fa115673636c0
Signed-off-by: Kaushal M <kaushal@redhat.com>
Reviewed-on: http://review.gluster.org/7995
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 26 |
1 files changed, 0 insertions, 26 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index d59aaa44aae..f9c38337473 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -938,32 +938,6 @@ _install_mount_spec (dict_t *opts, char *key, data_t *value, void *data) } -static int -gd_default_synctask_cbk (int ret, call_frame_t *frame, void *opaque) -{ - glusterd_conf_t *priv = THIS->private; - synclock_unlock (&priv->big_lock); - return ret; -} - -static void -glusterd_launch_synctask (synctask_fn_t fn, void *opaque) -{ - xlator_t *this = NULL; - glusterd_conf_t *priv = NULL; - int ret = -1; - - this = THIS; - priv = this->private; - - synclock_lock (&priv->big_lock); - ret = synctask_new (this->ctx->env, fn, gd_default_synctask_cbk, NULL, - opaque); - if (ret) - gf_log (this->name, GF_LOG_CRITICAL, "Failed to spawn bricks" - " and other volume related services"); -} - int glusterd_uds_rpcsvc_notify (rpcsvc_t *rpc, void *xl, rpcsvc_event_t event, void *data) |