From 953bdf315ffcca73e4aad3eafb5f25a0457947ca Mon Sep 17 00:00:00 2001 From: Atin Mukherjee Date: Wed, 3 May 2017 12:17:30 +0530 Subject: [PATCH 421/426] glusterd: cleanup pidfile on pmap signout This patch ensures 1. brick pidfile is cleaned up on pmap signout 2. pmap signout evemt is sent for all the bricks when a brick process shuts down. >Reviewed-on: https://review.gluster.org/17168 >Smoke: Gluster Build System >NetBSD-regression: NetBSD Build System >CentOS-regression: Gluster Build System >Reviewed-by: Jeff Darcy Change-Id: I7606a60775b484651d4b9743b6037b40323931a2 BUG: 1443972 Signed-off-by: Atin Mukherjee Reviewed-on: https://code.engineering.redhat.com/gerrit/105595 Reviewed-by: Prashanth Pai --- glusterfsd/src/glusterfsd.c | 18 ++++++++- xlators/mgmt/glusterd/src/glusterd-pmap.c | 31 ++++++++++++--- xlators/mgmt/glusterd/src/glusterd-utils.c | 62 ++++++++++++++++++++++++++++++ xlators/mgmt/glusterd/src/glusterd-utils.h | 4 ++ 4 files changed, 109 insertions(+), 6 deletions(-) diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index cbc1b93..7957f38 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1262,6 +1262,9 @@ cleanup_and_exit (int signum) { glusterfs_ctx_t *ctx = NULL; xlator_t *trav = NULL; + xlator_t *top; + xlator_t *victim; + xlator_list_t **trav_p; ctx = glusterfsd_ctx; @@ -1291,7 +1294,20 @@ cleanup_and_exit (int signum) return; ctx->cleanup_started = 1; - glusterfs_mgmt_pmap_signout (ctx, NULL); + + /* signout should be sent to all the bricks in case brick mux is enabled + * and multiple brick instances are attached to this process + */ + if (ctx->active) { + top = ctx->active->first; + for (trav_p = &top->children; *trav_p; + trav_p = &(*trav_p)->next) { + victim = (*trav_p)->xlator; + glusterfs_mgmt_pmap_signout (ctx, victim->name); + } + } else { + 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/xlators/mgmt/glusterd/src/glusterd-pmap.c b/xlators/mgmt/glusterd/src/glusterd-pmap.c index d87c31e..d67117f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-pmap.c +++ b/xlators/mgmt/glusterd/src/glusterd-pmap.c @@ -551,11 +551,20 @@ gluster_pmap_signin (rpcsvc_request_t *req) int __gluster_pmap_signout (rpcsvc_request_t *req) { - pmap_signout_req args = {0,}; - pmap_signout_rsp rsp = {0,}; - int ret = -1; - char brick_path[PATH_MAX] = {0,}; - glusterd_brickinfo_t *brickinfo = NULL; + pmap_signout_req args = {0,}; + pmap_signout_rsp rsp = {0,}; + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + glusterd_volinfo_t *volinfo = NULL; + glusterd_brickinfo_t *brickinfo = NULL; + char pidfile[PATH_MAX] = {0}; + char brick_path[PATH_MAX] = {0,}; + + this = THIS; + GF_VALIDATE_OR_GOTO ("glusterd", this, fail); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, conf, fail); ret = xdr_to_generic (req->msg[0], &args, (xdrproc_t)xdr_pmap_signout_req); @@ -574,6 +583,18 @@ __gluster_pmap_signout (rpcsvc_request_t *req) brick_path, GF_PMAP_PORT_BRICKSERVER, req->trans); } + /* Clean up the pidfile for this brick given glusterfsd doesn't clean it + * any more. This is required to ensure we don't end up with having + * stale pid files in case a brick is killed from the backend + */ + ret = glusterd_get_volinfo_from_brick (args.brick, &volinfo); + if (!ret) { + if (volinfo && brickinfo) { + GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, brickinfo, + conf); + sys_unlink (pidfile); + } + } fail: glusterd_submit_reply (req, &rsp, NULL, 0, NULL, diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 9eb6502..36eb1d1 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -5742,6 +5742,7 @@ glusterd_get_brickinfo (xlator_t *this, const char *brickname, int port, glusterd_conf_t *priv = NULL; glusterd_volinfo_t *volinfo = NULL; glusterd_brickinfo_t *tmpbrkinfo = NULL; + glusterd_snap_t *snap = NULL; int ret = -1; GF_ASSERT (brickname); @@ -5760,6 +5761,21 @@ glusterd_get_brickinfo (xlator_t *this, const char *brickname, int port, } } } + /* In case normal volume is not found, check for snapshot volumes */ + cds_list_for_each_entry (snap, &priv->snapshots, snap_list) { + cds_list_for_each_entry (volinfo, &snap->volumes, vol_list) { + cds_list_for_each_entry (tmpbrkinfo, &volinfo->bricks, + brick_list) { + if (gf_uuid_compare (tmpbrkinfo->uuid, MY_UUID)) + continue; + if (!strcmp(tmpbrkinfo->path, brickname)) { + *brickinfo = tmpbrkinfo; + return 0; + } + } + } + } + return ret; } @@ -12757,6 +12773,52 @@ out: return ret; } +int +glusterd_get_volinfo_from_brick (char *brick, glusterd_volinfo_t **volinfo) +{ + int ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + glusterd_volinfo_t *voliter = NULL; + glusterd_brickinfo_t *brickiter = NULL; + glusterd_snap_t *snap = NULL; + + this = THIS; + GF_VALIDATE_OR_GOTO ("glusterd", this, out); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, conf, out); + + /* First check for normal volumes */ + cds_list_for_each_entry (voliter, &conf->volumes, vol_list) { + cds_list_for_each_entry (brickiter, &voliter->bricks, + brick_list) { + if (gf_uuid_compare (brickiter->uuid, MY_UUID)) + continue; + if (!strcmp(brickiter->path, brick)) { + *volinfo = voliter; + return 0; + } + } + } + /* In case normal volume is not found, check for snapshot volumes */ + cds_list_for_each_entry (snap, &conf->snapshots, snap_list) { + cds_list_for_each_entry (voliter, &snap->volumes, vol_list) { + cds_list_for_each_entry (brickiter, &voliter->bricks, + brick_list) { + if (gf_uuid_compare (brickiter->uuid, MY_UUID)) + continue; + if (!strcmp(brickiter->path, brick)) { + *volinfo = voliter; + return 0; + } + } + } + } + +out: + return ret; +} + glusterd_op_t gd_cli_to_gd_op (char *cli_op) { diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index d3ff44f..aab6a29 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -820,4 +820,8 @@ glusterd_brick_op_prerequisites (dict_t *dict, char **src_brick, glusterd_brickinfo_t **src_brickinfo, char *pidfile, char **op_errstr, dict_t *rsp_dict); + +int +glusterd_get_volinfo_from_brick (char *brick, glusterd_volinfo_t **volinfo); + #endif -- 1.8.3.1