From 7aa3630b1f5e07227e9cd167cbd717bd7932ae78 Mon Sep 17 00:00:00 2001 From: Avra Sengupta Date: Fri, 13 Jun 2014 11:23:29 +0000 Subject: glusterd/snapshot: Update fstype and fsuuid Update fstype and fsuuid before creating missed snapshot Change-Id: Ie9af0065fab288bd1c1a26396428f0cee6335f97 BUG: 1109142 Signed-off-by: Avra Sengupta Reviewed-on: http://review.gluster.org/8062 Reviewed-by: Rajesh Joseph Tested-by: Justin Clift Reviewed-by: Krishnan Parthasarathi Tested-by: Krishnan Parthasarathi --- xlators/mgmt/glusterd/src/glusterd-handshake.c | 50 ++++++++++++++++++++------ xlators/mgmt/glusterd/src/glusterd-snapshot.c | 28 +++++++-------- xlators/mgmt/glusterd/src/glusterd-utils.h | 10 +++++- 3 files changed, 62 insertions(+), 26 deletions(-) (limited to 'xlators/mgmt/glusterd') diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index 115dd8bd145..7be1e9017bd 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -347,16 +347,17 @@ int32_t glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo, glusterd_snap_op_t *snap_opinfo) { - char *device = NULL; - glusterd_conf_t *priv = NULL; - glusterd_snap_t *snap = NULL; - glusterd_volinfo_t *snap_vol = NULL; - glusterd_volinfo_t *volinfo = NULL; - glusterd_brickinfo_t *brickinfo = NULL; - int32_t ret = -1; - int32_t i = 0; - uuid_t snap_uuid = {0,}; - xlator_t *this = NULL; + char *device = NULL; + char fstype[NAME_MAX] = ""; + glusterd_conf_t *priv = NULL; + glusterd_snap_t *snap = NULL; + glusterd_volinfo_t *snap_vol = NULL; + glusterd_volinfo_t *volinfo = NULL; + glusterd_brickinfo_t *brickinfo = NULL; + int32_t ret = -1; + int32_t i = 0; + uuid_t snap_uuid = {0,}; + xlator_t *this = NULL; this = THIS; GF_ASSERT (this); @@ -431,6 +432,18 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo, strncpy (brickinfo->device_path, device, sizeof(brickinfo->device_path)); + /* Update the backend file-system type of snap brick in + * snap volinfo. */ + ret = glusterd_update_fstype (snap_opinfo->brick_path, brickinfo, + fstype, sizeof(fstype)); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to update " + "file-system type for %s brick", + brickinfo->path); + /* We should not fail snapshot operation if we fail to get + * the file-system type */ + } + ret = glusterd_take_lvm_snapshot (brickinfo, snap_opinfo->brick_path); if (ret) { gf_log (this->name, GF_LOG_ERROR, @@ -439,6 +452,21 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo, goto out; } + /* After the snapshot both the origin brick (LVM brick) and + * the snapshot brick will have the same file-system UUID. This + * will cause lot of problems at mount time. Therefore we must + * generate a new UUID for the snapshot brick + */ + ret = glusterd_update_fs_uuid (brickinfo); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to update " + "file-system uuid for %s brick", brickinfo->path); + /* Failing to update UUID should not cause snapshot failure. + * Currently UUID is updated only for XFS and ext2/ext3/ext4 + * file-system. + */ + } + /* Create and mount the snap brick */ ret = glusterd_snap_brick_create (snap_vol, brickinfo, snap_opinfo->brick_num - 1); @@ -449,6 +477,7 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo, snap_vol->snapshot->snapname); goto out; } + brickinfo->snap_status = 0; ret = glusterd_store_volinfo (snap_vol, GLUSTERD_VOLINFO_VER_AC_NONE); @@ -459,7 +488,6 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo, goto out; } - ret = glusterd_brick_start (snap_vol, brickinfo, _gf_false); if (ret) { gf_log (this->name, GF_LOG_WARNING, "starting the " diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 8b3ffd5b760..117004b4452 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -3767,13 +3767,13 @@ out: * * @return 0 on success and -1 on failure */ -static int -glusterd_update_fstype (glusterd_brickinfo_t *orig_brickinfo, - glusterd_brickinfo_t *snap_brickinfo) +int +glusterd_update_fstype (char *orig_brick_path, + glusterd_brickinfo_t *snap_brickinfo, + char *fstype, size_t fslen) { int32_t ret = -1; char *mnt_pt = NULL; - char *fstype = NULL; char buff [PATH_MAX] = ""; char msg [PATH_MAX] = ""; char *cmd = NULL; @@ -3784,19 +3784,18 @@ glusterd_update_fstype (glusterd_brickinfo_t *orig_brickinfo, this = THIS; GF_ASSERT (this); - GF_ASSERT (orig_brickinfo); + GF_ASSERT (orig_brick_path); GF_ASSERT (snap_brickinfo); - - fstype = orig_brickinfo->fstype; + GF_ASSERT (fstype); /* If the file-system type is not set then set the file-system type * in origin brickinfo */ if (0 == fstype [0]) { - ret = glusterd_get_brick_root (orig_brickinfo->path, &mnt_pt); + ret = glusterd_get_brick_root (orig_brick_path, &mnt_pt); if (ret) { gf_log (this->name, GF_LOG_ERROR, "getting the root " "of the brick (%s) failed ", - orig_brickinfo->path); + orig_brick_path); goto out; } @@ -3805,14 +3804,14 @@ glusterd_update_fstype (glusterd_brickinfo_t *orig_brickinfo, if (!entry) { gf_log (this->name, GF_LOG_ERROR, "getting the mount " "entry for the brick (%s) failed", - orig_brickinfo->path); + orig_brick_path); ret = -1; goto out; } /* Update the origin brickinfo with the backend file-system * type */ - snprintf (fstype, sizeof (orig_brickinfo->fstype), "%s", + snprintf (fstype, fslen, "%s", entry->mnt_type); } @@ -3866,7 +3865,9 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict, /* Update the backend file-system type of snap brick in * snap volinfo. */ - ret = glusterd_update_fstype (original_brickinfo, snap_brickinfo); + ret = glusterd_update_fstype (original_brickinfo->path, snap_brickinfo, + original_brickinfo->fstype, + sizeof(original_brickinfo->fstype)); if (ret) { gf_log (this->name, GF_LOG_ERROR, "Failed to update " "file-system type for %s brick", @@ -3976,7 +3977,7 @@ out: * * @return 0 on success and -1 on failure */ -static int +int glusterd_update_fs_uuid (glusterd_brickinfo_t *brickinfo) { int32_t ret = -1; @@ -4140,7 +4141,6 @@ glusterd_take_brick_snapshot (dict_t *dict, glusterd_volinfo_t *snap_vol, */ } - /* create the complete brick here */ ret = glusterd_snap_brick_create (snap_vol, brickinfo, brick_count); if (ret) { diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 2a22831fe41..1764f642d3f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -890,6 +890,7 @@ glusterd_snapd_set_online_status (glusterd_volinfo_t *volinfo, int glusterd_restart_snapds (glusterd_conf_t *priv); +/* End snapd functions */ int32_t glusterd_check_and_set_config_limit (glusterd_conf_t *priv); @@ -897,10 +898,17 @@ glusterd_check_and_set_config_limit (glusterd_conf_t *priv); int32_t glusterd_is_snap_soft_limit_reached (glusterd_volinfo_t *volinfo, dict_t *dict); -/* End snapd functions */ int32_t glusterd_find_brick_mount_path (char *brick_path, int32_t brick_count, char **brick_mount_path); +int +glusterd_update_fstype (char *orig_brick_path, + glusterd_brickinfo_t *snap_brickinfo, + char *fstype, size_t fslen); + +int +glusterd_update_fs_uuid (glusterd_brickinfo_t *brickinfo); + #endif -- cgit