snapshot: Fix finding brick mount path logic

Previously while finding brick mount paths
of snap volume's bricks, we were taking brick order
into consideration. This logic fails when a brick is
removed or a tier is added.

Hence modifying the logic to look for the first
occurence of the word "brick" in the brick path.
From there we iterate till we find a '/'. The string
till the first '/' after we encounter the word brick
is the brick mount path.

Change-Id: Ic85983c4e975e701cdfd4e13f8e276ac391a3e49
BUG: 1227646
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-on: http://review.gluster.org/11060
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
This commit is contained in:
Avra Sengupta 2015-06-03 15:18:08 +05:30 committed by Krishnan Parthasarathi
parent d2d7afefd8
commit bf3a6dcdf3
4 changed files with 44 additions and 15 deletions

View File

@ -0,0 +1,32 @@
#!/bin/bash
. $(dirname $0)/../../volume.rc
. $(dirname $0)/../../snapshot.rc
. $(dirname $0)/../../include.rc
cleanup;
TEST init_n_bricks 3;
TEST setup_lvm 3;
TEST glusterd;
TEST pidof glusterd;
#TEST $CLI volume create $V0 $H0:$L1 $H0:$L2 $H0:$L3;
TEST $CLI volume create $V0 $H0:$L2 $H0:$L3;
TEST $CLI volume start $V0;
TEST $CLI snapshot create snap1 $V0 no-timestamp;
TEST $CLI volume stop $V0
TEST $CLI snapshot restore snap1;
TEST $CLI volume start $V0
TEST $CLI volume attach-tier $V0 $H0:$L1 $H0:$L2
TEST pkill gluster
TEST glusterd
EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'
TEST $CLI volume stop $V0
cleanup ;

View File

@ -2716,7 +2716,6 @@ glusterd_lvm_snapshot_remove (dict_t *rsp_dict, glusterd_volinfo_t *snap_vol)
/* Fetch the brick mount path from the brickinfo->path */
ret = glusterd_find_brick_mount_path (brickinfo->path,
brick_count + 1,
&brick_mount_path);
if (ret) {
gf_msg (this->name, GF_LOG_ERROR, 0,

View File

@ -2967,11 +2967,10 @@ out:
/* Figure out the brick mount path, from the brick path */
int32_t
glusterd_find_brick_mount_path (char *brick_path, int32_t brick_count,
char **brick_mount_path)
glusterd_find_brick_mount_path (char *brick_path, char **brick_mount_path)
{
char brick_num[PATH_MAX] = "";
char *ptr = NULL;
char *save_ptr = NULL;
int32_t ret = -1;
xlator_t *this = NULL;
@ -2986,12 +2985,10 @@ glusterd_find_brick_mount_path (char *brick_path, int32_t brick_count,
goto out;
}
snprintf (brick_num, sizeof(brick_num), "brick%d", brick_count);
/* Finding the pointer to the end of
* /var/run/gluster/snaps/<snap-uuid>
*/
ptr = strstr (*brick_mount_path, brick_num);
ptr = strstr (*brick_mount_path, "brick");
if (!ptr) {
/* Snapshot bricks must have brick num as part
* of the brickpath
@ -3006,8 +3003,13 @@ glusterd_find_brick_mount_path (char *brick_path, int32_t brick_count,
* /var/run/gluster/snaps/<snap-uuid>/<brick_num>
* and assigning '\0' to it.
*/
ptr += strlen(brick_num);
*ptr = '\0';
while ((*ptr != '\0') && (*ptr != '/'))
ptr++;
if (*ptr == '/') {
ptr++;
*ptr = '\0';
}
ret = 0;
out:
@ -3091,15 +3093,12 @@ glusterd_recreate_vol_brick_mounts (xlator_t *this,
char *brick_mount_path = NULL;
glusterd_brickinfo_t *brickinfo = NULL;
int32_t ret = -1;
int32_t brick_count = -1;
struct stat st_buf = {0, };
GF_ASSERT (this);
GF_ASSERT (volinfo);
brick_count = 0;
cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
brick_count++;
/* If the brick is not of this node, or its
* snapshot is pending, or the brick is not
* a snapshotted brick, we continue
@ -3111,7 +3110,6 @@ glusterd_recreate_vol_brick_mounts (xlator_t *this,
/* Fetch the brick mount path from the brickinfo->path */
ret = glusterd_find_brick_mount_path (brickinfo->path,
brick_count,
&brick_mount_path);
if (ret) {
gf_log (this->name, GF_LOG_ERROR,

View File

@ -577,8 +577,8 @@ int
glusterd_unlink_file (char *sock_file_path);
int32_t
glusterd_find_brick_mount_path (char *brick_path, int32_t brick_count,
char **brick_mount_path);
glusterd_find_brick_mount_path (char *brick_path, char **brick_mount_path);
/*
* Function to retrieve list of snap volnames and their uuids
*/