From dba55ae364a2772904bb68a6bd0ea87289ee1470 Mon Sep 17 00:00:00 2001 From: Mohit Agrawal Date: Thu, 25 May 2017 21:43:42 +0530 Subject: glusterfs: Not able to mount running volume after enable brick mux and stopped any volume Problem: After enabled brick mux if any volume has down and then try ot run mount with running volume , mount command is hung. Solution: After enable brick mux server has shared one data structure server_conf for all associated subvolumes.After down any subvolume in some ungraceful manner (remove brick directory) posix xlator sends GF_EVENT_CHILD_DOWN event to parent xlatros and server notify updates the child_up to false in server_conf.When client is trying to communicate with server through mount it checks conf->child_up and it is FALSE so it throws message "translator are not yet ready". From this patch updated structure server_conf to save child_up status for xlator wise. Another improtant correction from this patch is cleanup threads from server side xlators after stop the volume. BUG: 1453977 Change-Id: Ic54da3f01881b7c9429ce92cc569236eb1d43e0d Signed-off-by: Mohit Agrawal Reviewed-on: https://review.gluster.org/17356 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System Reviewed-by: Raghavendra Talur CentOS-regression: Gluster Build System Reviewed-by: Jeff Darcy --- xlators/features/changelog/src/changelog.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'xlators/features/changelog/src/changelog.c') diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c index 697e8ca7b11..20af188d0d4 100644 --- a/xlators/features/changelog/src/changelog.c +++ b/xlators/features/changelog/src/changelog.c @@ -21,6 +21,7 @@ #include "changelog-messages.h" #include +#include #include "changelog-rpc.h" #include "errno.h" @@ -2098,6 +2099,7 @@ notify (xlator_t *this, int event, void *data, ...) int ret = 0; int ret1 = 0; struct list_head queue = {0, }; + int i = 0; INIT_LIST_HEAD (&queue); @@ -2105,6 +2107,20 @@ notify (xlator_t *this, int event, void *data, ...) if (!priv) goto out; + if (event == GF_EVENT_CLEANUP) { + if (priv->connector) { + (void) gf_thread_cleanup_xint (priv->connector); + priv->connector = 0; + } + + for (; i < NR_DISPATCHERS; i++) { + if (priv->ev_dispatcher[i]) { + (void) gf_thread_cleanup_xint (priv->ev_dispatcher[i]); + priv->ev_dispatcher[i] = 0; + } + } + } + if (event == GF_EVENT_TRANSLATOR_OP) { dict = data; -- cgit