From 1e3538baab7abc29ac329c78182b62558da56d98 Mon Sep 17 00:00:00 2001 From: Samikshan Bairagya Date: Mon, 20 Feb 2017 18:35:01 +0530 Subject: core: Clean up pmap registry up correctly on volume/brick stop This commit changes the following: 1. In glusterfs_handle_terminate, send out individual pmap signout requests to glusterd for every brick. 2. Add another parameter to glusterfs_mgmt_pmap_signout function to pass the brickname that needs to be removed from the pmap registry. 3. Make sure pmap_registry_search doesn't break out from the loop iterating over the list of bricks per port if the first brick entry corresponding to a port is whitespaced out. 4. Make sure the pmap registry entries are removed for other daemons like snapd. Change-Id: I69949874435b02699e5708dab811777ccb297174 BUG: 1421590 Signed-off-by: Samikshan Bairagya Reviewed-on: https://review.gluster.org/16689 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Gaurav Yadav Reviewed-by: Jeff Darcy --- glusterfsd/src/glusterfsd-mgmt.c | 15 +++++++++++---- glusterfsd/src/glusterfsd.c | 2 +- glusterfsd/src/glusterfsd.h | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) (limited to 'glusterfsd/src') diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index 57f8dc0405c..6871582abb0 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -234,6 +234,7 @@ glusterfs_handle_terminate (rpcsvc_request_t *req) gf_log (THIS->name, GF_LOG_INFO, "terminating after loss of last child %s", xlator_req.name); + glusterfs_mgmt_pmap_signout (glusterfsd_ctx, xlator_req.name); cleanup_and_exit (SIGTERM); } else { /* @@ -246,6 +247,8 @@ glusterfs_handle_terminate (rpcsvc_request_t *req) gf_log (THIS->name, GF_LOG_INFO, "detaching not-only child %s", xlator_req.name); top->notify (top, GF_EVENT_TRANSPORT_CLEANUP, victim); + glusterfs_mgmt_pmap_signout (glusterfsd_ctx, xlator_req.name); + *trav_p = (*trav_p)->next; glusterfs_autoscale_threads (THIS->ctx, -1); } @@ -2563,7 +2566,7 @@ out: int -glusterfs_mgmt_pmap_signout (glusterfs_ctx_t *ctx) +glusterfs_mgmt_pmap_signout (glusterfs_ctx_t *ctx, char *brickname) { int ret = 0; pmap_signout_req req = {0, }; @@ -2574,7 +2577,7 @@ glusterfs_mgmt_pmap_signout (glusterfs_ctx_t *ctx) frame = create_frame (THIS, ctx->pool); cmd_args = &ctx->cmd_args; - if (!cmd_args->brick_port || !cmd_args->brick_name) { + if (!cmd_args->brick_port && (!cmd_args->brick_name || !brickname)) { gf_log ("fsd-mgmt", GF_LOG_DEBUG, "portmapper signout arguments not given"); goto out; @@ -2585,8 +2588,12 @@ glusterfs_mgmt_pmap_signout (glusterfs_ctx_t *ctx) snprintf (brick_name, sizeof(brick_name), "%s.rdma", cmd_args->brick_name); req.brick = brick_name; - } else - req.brick = cmd_args->brick_name; + } else { + if (brickname) + req.brick = brickname; + else + req.brick = cmd_args->brick_name; + } req.port = cmd_args->brick_port; req.rdma_port = cmd_args->brick_port2; diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index f402246e78e..e3699739c07 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1332,7 +1332,7 @@ cleanup_and_exit (int signum) return; ctx->cleanup_started = 1; - glusterfs_mgmt_pmap_signout (ctx); + glusterfs_mgmt_pmap_signout (ctx, NULL); /* below part is a racy code where the rpcsvc object is freed. * But in another thread (epoll thread), upon poll error in the diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h index e442bede5db..6a30ee9e3f7 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -109,7 +109,7 @@ struct _gfd_vol_top_priv_t { }; typedef struct _gfd_vol_top_priv_t gfd_vol_top_priv_t; -int glusterfs_mgmt_pmap_signout (glusterfs_ctx_t *ctx); +int glusterfs_mgmt_pmap_signout (glusterfs_ctx_t *ctx, char *brick_name); int glusterfs_mgmt_pmap_signin (glusterfs_ctx_t *ctx); int glusterfs_volfile_fetch (glusterfs_ctx_t *ctx); void cleanup_and_exit (int signum); -- cgit