summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t34
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-store.c58
2 files changed, 76 insertions, 16 deletions
diff --git a/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t b/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t
new file mode 100644
index 00000000000..68dc0bbe0f7
--- /dev/null
+++ b/tests/bugs/snapshot/bug-1322772-real-path-fix-for-snapshot.t
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+. $(dirname $0)/../../volume.rc
+. $(dirname $0)/../../snapshot.rc
+. $(dirname $0)/../../include.rc
+cleanup;
+
+TEST verify_lvm_version
+TEST init_n_bricks 1
+TEST setup_lvm 1
+
+TEST glusterd
+TEST pidof glusterd
+
+TEST $CLI volume create $V0 $H0:$L1
+EXPECT 'Created' volinfo_field $V0 'Status'
+
+TEST $CLI volume start $V0
+EXPECT 'Started' volinfo_field $V0 'Status'
+
+TEST $CLI snapshot create ${V0}_snap $V0
+
+# Simulate a node reboot by unmounting the brick, snap_brick and followed by
+# deleting the brick. Now once glusterd restarts, it should be able to construct
+# and remount the snap brick
+snap_brick=`gluster snap status | grep "Brick Path" | awk -F ":" '{print $3}'`
+
+pkill gluster
+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $L1
+EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $snap_brick
+rm -rf $snap_brick
+
+TEST glusterd
+TEST pidof glusterd
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c
index 97f5147dd39..c776e4b5249 100644
--- a/xlators/mgmt/glusterd/src/glusterd-store.c
+++ b/xlators/mgmt/glusterd/src/glusterd-store.c
@@ -2385,24 +2385,34 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)
GLUSTERD_ASSIGN_BRICKID_TO_BRICKINFO (brickinfo, volinfo,
brickid++);
}
- /* By now if the brick is a local brick then it will be able to
- * resolve which is the only thing we want now for checking
- * whether the brickinfo->uuid matches with MY_UUID for realpath
- * check. Hence do not handle error
+ /* Populate brickinfo->real_path for normal volumes, for
+ * snapshot or snapshot restored volume this would be done post
+ * creating the brick mounts
*/
- (void)glusterd_resolve_brick (brickinfo);
- if (!gf_uuid_compare(brickinfo->uuid, MY_UUID)) {
- if (!realpath (brickinfo->path, abspath)) {
- gf_msg (this->name, GF_LOG_CRITICAL, errno,
- GD_MSG_BRICKINFO_CREATE_FAIL, "realpath"
- " () failed for brick %s. The "
- "underlying file system may be in bad"
- " state", brickinfo->path);
- ret = -1;
- goto out;
+ if (!volinfo->is_snap_volume &&
+ gf_uuid_is_null (volinfo->restored_from_snap)) {
+ /* By now if the brick is a local brick then it will be
+ * able to resolve which is the only thing we want now
+ * for checking whether the brickinfo->uuid matches
+ * with MY_UUID for realpath check. Hence do not handle
+ * error
+ */
+ (void)glusterd_resolve_brick (brickinfo);
+ if (!gf_uuid_compare(brickinfo->uuid, MY_UUID)) {
+ if (!realpath (brickinfo->path, abspath)) {
+ gf_msg (this->name, GF_LOG_CRITICAL,
+ errno,
+ GD_MSG_BRICKINFO_CREATE_FAIL,
+ "realpath() failed for brick %s"
+ ". The underlying file system "
+ "may be in bad state",
+ brickinfo->path);
+ ret = -1;
+ goto out;
+ }
+ strncpy (brickinfo->real_path, abspath,
+ strlen(abspath));
}
- strncpy (brickinfo->real_path, abspath,
- strlen(abspath));
}
cds_list_add_tail (&brickinfo->brick_list, &volinfo->bricks);
brick_count++;
@@ -3216,6 +3226,7 @@ glusterd_recreate_vol_brick_mounts (xlator_t *this,
glusterd_brickinfo_t *brickinfo = NULL;
int32_t ret = -1;
struct stat st_buf = {0, };
+ char abspath[PATH_MAX] = {0};
GF_ASSERT (this);
GF_ASSERT (volinfo);
@@ -3272,6 +3283,21 @@ glusterd_recreate_vol_brick_mounts (xlator_t *this,
GD_MSG_BRK_MNTPATH_MOUNT_FAIL,
"Failed to mount brick_mount_path");
}
+ if (!gf_uuid_compare(brickinfo->uuid, MY_UUID)) {
+ if (!realpath (brickinfo->path, abspath)) {
+ gf_msg (this->name, GF_LOG_CRITICAL,
+ errno,
+ GD_MSG_BRICKINFO_CREATE_FAIL,
+ "realpath() failed for brick %s"
+ ". The underlying file system "
+ "may be in bad state",
+ brickinfo->path);
+ ret = -1;
+ goto out;
+ }
+ strncpy (brickinfo->real_path, abspath,
+ strlen(abspath));
+ }
if (brick_mount_path) {
GF_FREE (brick_mount_path);