From 9ca7f82bed06ec521295de2d78abd688143d15a9 Mon Sep 17 00:00:00 2001 From: Avra Sengupta Date: Wed, 3 Jun 2015 15:18:08 +0530 Subject: [PATCH 23/57] snapshot: Fix finding brick mount path logic Backport of http://review.gluster.org/#/c/11060/ 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: 1224175 Signed-off-by: Avra Sengupta (cherry picked from commit bf3a6dcdf3c8a8a64e7c864b56c4d9be60fca8e6) Reviewed-on: https://code.engineering.redhat.com/gerrit/50360 Reviewed-by: Rajesh Joseph Tested-by: Rajesh Joseph --- tests/bugs/snapshot/bug-1227646.t | 32 +++++++++++++++++++++++++ xlators/mgmt/glusterd/src/glusterd-snapshot.c | 1 - xlators/mgmt/glusterd/src/glusterd-store.c | 22 +++++++--------- xlators/mgmt/glusterd/src/glusterd-utils.h | 4 +- 4 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 tests/bugs/snapshot/bug-1227646.t diff --git a/tests/bugs/snapshot/bug-1227646.t b/tests/bugs/snapshot/bug-1227646.t new file mode 100644 index 0000000..643d814 --- /dev/null +++ b/tests/bugs/snapshot/bug-1227646.t @@ -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 ; + diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 668c26e..0ea3935 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -2721,7 +2721,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, diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index cb312ae..ee279d3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -2972,11 +2972,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; @@ -2991,12 +2990,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/ */ - 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 @@ -3011,8 +3008,13 @@ glusterd_find_brick_mount_path (char *brick_path, int32_t brick_count, * /var/run/gluster/snaps// * and assigning '\0' to it. */ - ptr += strlen(brick_num); - *ptr = '\0'; + while ((*ptr != '\0') && (*ptr != '/')) + ptr++; + + if (*ptr == '/') { + ptr++; + *ptr = '\0'; + } ret = 0; out: @@ -3096,15 +3098,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 @@ -3116,7 +3115,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, diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index d617f60..27c51fa 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -582,8 +582,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 */ -- 1.7.1