diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 9d496e56c07..185186a8ad6 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -5938,6 +5938,31 @@ out: static int gd_stale_rpc_disconnect_log; +static int +glusterd_mark_bricks_stopped_by_proc (glusterd_brick_proc_t *brick_proc) { + glusterd_brickinfo_t *brickinfo = NULL; + glusterd_brickinfo_t *brickinfo_tmp = NULL; + glusterd_volinfo_t *volinfo = NULL; + int ret = -1; + + cds_list_for_each_entry (brickinfo, &brick_proc->bricks, brick_list) { + ret = glusterd_get_volinfo_from_brick (brickinfo->path, &volinfo); + if (ret) { + gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_GET_FAIL, + "Failed to get volinfo from brick(%s)", + brickinfo->path); + goto out; + } + cds_list_for_each_entry (brickinfo_tmp, &volinfo->bricks, brick_list) { + if (strcmp (brickinfo->path, brickinfo_tmp->path) == 0) + glusterd_set_brick_status (brickinfo_tmp, GF_BRICK_STOPPED); + } + } + return 0; +out: + return ret; +} + int __glusterd_brick_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event, void *data) @@ -5948,6 +5973,9 @@ __glusterd_brick_rpc_notify (struct rpc_clnt *rpc, void *mydata, glusterd_brickinfo_t *brickinfo = NULL; glusterd_volinfo_t *volinfo = NULL; xlator_t *this = NULL; + int temp = 0; + glusterd_brickinfo_t *brickinfo_tmp = NULL; + glusterd_brick_proc_t *brick_proc = NULL; brickid = mydata; if (!brickid) @@ -6048,7 +6076,36 @@ __glusterd_brick_rpc_notify (struct rpc_clnt *rpc, void *mydata, brickinfo->path); } - glusterd_set_brick_status (brickinfo, GF_BRICK_STOPPED); + if (is_brick_mx_enabled()) { + cds_list_for_each_entry (brick_proc, &conf->brick_procs, + brick_proc_list) { + cds_list_for_each_entry (brickinfo_tmp, + &brick_proc->bricks, + brick_list) { + if (strcmp (brickinfo_tmp->path, + brickinfo->path) == 0) { + ret = glusterd_mark_bricks_stopped_by_proc + (brick_proc); + if (ret) { + gf_msg(THIS->name, + GF_LOG_ERROR, 0, + GD_MSG_BRICK_STOP_FAIL, + "Unable to stop " + "bricks of process" + " to which brick(%s)" + " belongs", + brickinfo->path); + goto out; + } + temp = 1; + break; + } + } + if (temp == 1) + break; + } + } else + glusterd_set_brick_status (brickinfo, GF_BRICK_STOPPED); break; case RPC_CLNT_DESTROY: |