glusterd: remove-brick: prevent removal from a replicate volume.

Prevent the removal of brick(s) from a plain replicate volume and
display the error message at the CLI.

Change-Id: I8e182404564147329d8cd364b7c7931d19f14570
BUG: 961669
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/4975
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
This commit is contained in:
Ravishankar N 2013-05-09 16:14:33 +00:00 committed by Vijay Bellur
parent fd36cabb0d
commit 0d415f7f8c
3 changed files with 58 additions and 2 deletions

View File

@ -2007,6 +2007,8 @@ gf_cli_remove_brick_cbk (struct rpc_req *req, struct iovec *iov,
if (ret) {
gf_log ("cli", GF_LOG_ERROR,
"remove-brick-id is not present in dict");
cli_err ("volume remove-brick %s: failed: %s", cmd_str,
rsp.op_errstr);
goto out;
}
break;

43
tests/bugs/bug-961669.t Normal file
View File

@ -0,0 +1,43 @@
#!/bin/bash
#Test case: Create a replicate volume; mount and write to it; kill one brick; try to remove the other.
. $(dirname $0)/../include.rc
. $(dirname $0)/../volume.rc
cleanup;
#Basic checks
TEST glusterd
TEST pidof glusterd
TEST $CLI volume info
#Create a 1x2 replicate volume
TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1};
TEST $CLI volume start $V0
# Mount FUSE and create file/directory
TEST glusterfs -s $H0 --volfile-id $V0 $M0
TEST touch $M0/zerobytefile.txt
TEST mkdir $M0/test_dir
TEST dd if=/dev/zero of=$M0/file bs=1024 count=1024
#Kill one of the bricks. This step can be skipped without affecting the outcome of the test.
kill -9 `cat /var/lib/glusterd/vols/$V0/run/$H0-d-backends-${V0}1.pid`;
function remove_brick_status {
$CLI volume remove-brick $V0 replica 1 $H0:$B0/${V0}1 start 2>&1
}
#Remove brick
EXPECT "volume remove-brick start: failed: Removing brick from a replicate volume is not allowed" remove_brick_status;
#Check the volume type
EXPECT "Replicate" echo `$CLI volume info |grep Type |awk '{print $2}'`
TEST umount $M0
TEST $CLI volume stop $V0
TEST $CLI volume delete $V0;
TEST ! $CLI volume info $V0;
cleanup;

View File

@ -671,16 +671,27 @@ __glusterd_handle_remove_brick (rpcsvc_request_t *req)
strcpy (vol_type, "distribute");
}
/* Do not allow remove-brick if the volume is plain stripe */
/* Do not allow remove-brick if the volume is a stripe volume*/
if ((volinfo->type == GF_CLUSTER_TYPE_STRIPE) &&
(volinfo->brick_count == volinfo->stripe_count)) {
snprintf (err_str, sizeof (err_str),
"Removing brick from a plain stripe is not allowed");
"Removing brick from a stripe volume is not allowed");
gf_log (this->name, GF_LOG_ERROR, "%s", err_str);
ret = -1;
goto out;
}
/*Do not allow remove-brick if the volume is a replicate volume*/
if ((volinfo->type == GF_CLUSTER_TYPE_REPLICATE) &&
(volinfo->brick_count == volinfo->replica_count)) {
snprintf (err_str, sizeof(err_str),
"Removing brick from a replicate volume "
"is not allowed");
gf_log (this->name, GF_LOG_ERROR, "%s", err_str);
ret = -1;
goto out;
}
if (!replica_count &&
(volinfo->type == GF_CLUSTER_TYPE_STRIPE_REPLICATE) &&
(volinfo->brick_count == volinfo->dist_leaf_count)) {