summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAtin Mukherjee <amukherj@redhat.com>2017-05-03 12:17:30 +0530
committerRaghavendra Talur <rtalur@redhat.com>2017-05-10 10:42:07 +0000
commit68047830e46f1ee2bd17d16ca6206cd0123e1ed2 (patch)
treedafa13082de8ff05275f8db31bc40746da7a19f0
parent38496dd45780e651647c294b782268557ce31836 (diff)
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 <jenkins@build.gluster.org> >NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> >CentOS-regression: Gluster Build System <jenkins@build.gluster.org> >Reviewed-by: Jeff Darcy <jeff@pl.atyp.us> >(cherry picked from commit 3d35e21ffb15713237116d85711e9cd1dda1688a) Change-Id: I7606a60775b484651d4b9743b6037b40323931a2 BUG: 1449002 Signed-off-by: Atin Mukherjee <amukherj@redhat.com> Reviewed-on: https://review.gluster.org/17209 Smoke: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Prashanth Pai <ppai@redhat.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
-rw-r--r--glusterfsd/src/glusterfsd.c18
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-pmap.c31
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c62
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.h4
4 files changed, 109 insertions, 6 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
index 41515fe12e7..dd89c47ff43 100644
--- a/glusterfsd/src/glusterfsd.c
+++ b/glusterfsd/src/glusterfsd.c
@@ -1303,6 +1303,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;
@@ -1332,7 +1335,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 9b2954af64d..0507715305c 100644
--- a/xlators/mgmt/glusterd/src/glusterd-pmap.c
+++ b/xlators/mgmt/glusterd/src/glusterd-pmap.c
@@ -519,11 +519,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);
@@ -542,6 +551,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 df058330cd0..e7fd01aabb2 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -5827,6 +5827,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);
@@ -5845,6 +5846,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;
}
@@ -13212,6 +13228,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 db13c4c8ad4..31bf462bcad 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.h
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.h
@@ -847,4 +847,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