summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
diff options
context:
space:
mode:
authorJeff Darcy <jdarcy@redhat.com>2017-02-02 13:08:04 -0500
committerAtin Mukherjee <amukherj@redhat.com>2017-02-02 23:06:09 -0500
commitb4aac5d334d5102ef3b935a200502cfcd63bd12c (patch)
tree53d15581285af59258d366a9d9507caeec559e6f /xlators/mgmt/glusterd/src/glusterd-brick-ops.c
parent1e849f616f6ae2f97ab307abaff69182c87571ca (diff)
glusterd: double-check brick liveness for remove-brick validation
Same problem as https://review.gluster.org/#/c/16509/ in a different place. Tests detach bricks without glusterd's knowledge, so glusterd's internal brick state is out of date and we have to re-check (via the brick's pidfile) as well. BUG: 1385758 Change-Id: I169538c1c62d72a685a49d57ef65fb6c3db6eab2 Signed-off-by: Jeff Darcy <jdarcy@redhat.com> Reviewed-on: https://review.gluster.org/16529 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: Atin Mukherjee <amukherj@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-brick-ops.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-brick-ops.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
index c78fbd8345c..7b5264ad8a1 100644
--- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
@@ -1947,6 +1947,8 @@ glusterd_remove_brick_validate_bricks (gf1_op_commands cmd, int32_t brick_count,
glusterd_peerinfo_t *peerinfo = NULL;
int i = 0;
int ret = -1;
+ char pidfile[PATH_MAX+1] = {0,};
+ glusterd_conf_t *priv = THIS->private;
/* Check whether all the nodes of the bricks to be removed are
* up, if not fail the operation */
@@ -2008,16 +2010,30 @@ glusterd_remove_brick_validate_bricks (gf1_op_commands cmd, int32_t brick_count,
}
if (glusterd_is_local_brick (THIS, volinfo, brickinfo)) {
- if (((cmd == GF_OP_CMD_START) ||
- (cmd == GF_OP_CMD_DETACH_START) ||
- (cmd == GF_DEFRAG_CMD_DETACH_START)) &&
- brickinfo->status != GF_BRICK_STARTED) {
+ switch (cmd) {
+ case GF_OP_CMD_START:
+ case GF_OP_CMD_DETACH_START:
+ case GF_DEFRAG_CMD_DETACH_START:
+ break;
+ default:
+ continue;
+ }
+ if (brickinfo->status != GF_BRICK_STARTED) {
snprintf (msg, sizeof (msg), "Found stopped "
"brick %s", brick);
*errstr = gf_strdup (msg);
ret = -1;
goto out;
}
+ GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo,
+ brickinfo, priv);
+ if (!gf_is_service_running (pidfile, NULL)) {
+ snprintf (msg, sizeof (msg), "Found dead "
+ "brick %s", brick);
+ *errstr = gf_strdup (msg);
+ ret = -1;
+ goto out;
+ }
continue;
}