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/protocol/server/src/server-handshake.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'xlators/protocol/server/src/server-handshake.c') diff --git a/xlators/protocol/server/src/server-handshake.c b/xlators/protocol/server/src/server-handshake.c index f00804a3d3a..f8f8f99f123 100644 --- a/xlators/protocol/server/src/server-handshake.c +++ b/xlators/protocol/server/src/server-handshake.c @@ -413,6 +413,7 @@ server_setvolume (rpcsvc_request_t *req) int32_t fop_version = 0; int32_t mgmt_version = 0; glusterfs_ctx_t *ctx = NULL; + struct _child_status *tmp = NULL; params = dict_new (); reply = dict_new (); @@ -512,13 +513,24 @@ server_setvolume (rpcsvc_request_t *req) "initialised yet. Try again later"); goto fail; } - - ret = dict_set_int32 (reply, "child_up", conf->child_up); - if (ret < 0) + list_for_each_entry (tmp, &conf->child_status->status_list, + status_list) { + if (strcmp (tmp->name, name) == 0) + break; + } + if (!tmp->name) { gf_msg (this->name, GF_LOG_ERROR, 0, - PS_MSG_DICT_GET_FAILED, "Failed to set 'child_up' " - "in the reply dict"); - + PS_MSG_CHILD_STATUS_FAILED, + "No xlator %s is found in " + "child status list", name); + } else { + ret = dict_set_int32 (reply, "child_up", tmp->child_up); + if (ret < 0) + gf_msg (this->name, GF_LOG_ERROR, 0, + PS_MSG_DICT_GET_FAILED, + "Failed to set 'child_up' for xlator %s " + "in the reply dict", tmp->name); + } ret = dict_get_str (params, "process-uuid", &client_uid); if (ret < 0) { ret = dict_set_str (reply, "ERROR", -- cgit