From eed0caca2d35ece6a8eba977937f31599d6d9021 Mon Sep 17 00:00:00 2001 From: Avra Sengupta Date: Thu, 5 Dec 2013 01:51:35 +0000 Subject: glusterd/snapshot: Fix for cksum mismatches at snap create. Also fixes peer rejects on glusterd restart Change-Id: I1671416c1f3fd2afea450cc3b4c632de187351ca Signed-off-by: Avra Sengupta --- xlators/mgmt/glusterd/src/glusterd-snapshot.c | 86 ++++++++++++++++++++++++--- xlators/mgmt/glusterd/src/glusterd-store.h | 3 + xlators/mgmt/glusterd/src/glusterd-utils.c | 6 +- 3 files changed, 84 insertions(+), 11 deletions(-) diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 3e98e2fa2..cc56f9019 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -678,9 +678,12 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, char *device = NULL; char *tmpstr = NULL; char *snap_brick_dir = NULL; + char *username = NULL; + char *password = NULL; char snap_brick_path[PATH_MAX] = ""; char *mnt_pt = NULL; char snapname[PATH_MAX] = ""; + char tmpname[PATH_MAX] = ""; char tmp[2046] = ""; char volname_buf[PATH_MAX] = ""; char snap_mount[PATH_MAX] = ""; @@ -698,6 +701,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, gf_boolean_t is_cg = _gf_false; uuid_t *cg_id = NULL; uuid_t *snap_volid = NULL; + uuid_t tmp_uuid = {0}; xlator_t *this = NULL; this = THIS; @@ -810,6 +814,30 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, snprintf (snapname, sizeof (snapname), "%s_%s", name, tmp); } + /* generate internal username and password for the snap*/ + + uuid_generate (tmp_uuid); + username = gf_strdup (uuid_utoa (tmp_uuid)); + snprintf (tmpname, sizeof(tmpname), "volume%ld_username", i+1); + ret = dict_set_dynstr (dict, tmpname, username); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to set snap username for " + "volume %s", volname); + GF_FREE (username); + goto out; + } + + uuid_generate (tmp_uuid); + password = gf_strdup (uuid_utoa (tmp_uuid)); + snprintf (tmpname, sizeof(tmpname), "volume%ld_password", i+1); + ret = dict_set_dynstr (dict, tmpname, password); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to set snap password for " + "volume %s", volname); + GF_FREE (password); + goto out; + } + //Also check whether geo replication is running brick_count = 0; @@ -907,7 +935,6 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, memset (snapbrckcnt, '\0', sizeof(snapbrckcnt)); ret = snprintf (snapbrckcnt, sizeof(snapbrckcnt) - 1, "vol%ld_brickcount", i+1); - snapbrckcnt[ret] = '\0'; ret = dict_set_int64 (rsp_dict, snapbrckcnt, brick_count); if (ret) { @@ -928,7 +955,6 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, memset (snapvolidname, '\0', sizeof(snapvolidname)); ret = snprintf (snapvolidname, sizeof(snapvolidname) - 1, "vol%ld_volid", i+1); - snapvolidname[ret] = '\0'; uuid_generate (*snap_volid); ret = dict_set_bin (dict, snapvolidname, snap_volid, sizeof(uuid_t)); @@ -3015,8 +3041,11 @@ glusterd_do_snap (glusterd_volinfo_t *volinfo, char *snapname, dict_t *dict, { char *snap_brick_mount_path = ""; char snapmntname[PATH_MAX] = ""; + char tmpname[PATH_MAX] = ""; char *device = NULL; char *description = NULL; + char *username = NULL; + char *password = NULL; glusterd_brickinfo_t *snap_brickinfo = NULL; glusterd_brickinfo_t *brickinfo = NULL; glusterd_conf_t *priv = NULL; @@ -3039,6 +3068,27 @@ glusterd_do_snap (glusterd_volinfo_t *volinfo, char *snapname, dict_t *dict, sizeof(snap_volume->parent_volname) - 1); uuid_copy (snap_volume->volume_id, snap_volid); + /* fetch internal username and password for the snap*/ + + snprintf (tmpname, sizeof(tmpname), "volume%d_username", volcount); + ret = dict_get_str (dict, tmpname, &username); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to get snap username for " + "volume %s", volinfo->volname); + goto out; + } + + snprintf (tmpname, sizeof(tmpname), "volume%d_password", volcount); + ret = dict_get_str (dict, tmpname, &password); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to get snap password for " + "volume %s", volinfo->volname); + goto out; + } + + glusterd_auth_set_username (snap_volume, username); + glusterd_auth_set_password (snap_volume, password); + /* Adding snap brickinfos to the snap volinfo */ brick_count = 0; list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { @@ -3093,14 +3143,19 @@ glusterd_do_snap (glusterd_volinfo_t *volinfo, char *snapname, dict_t *dict, ret = glusterd_take_snapshot (brickinfo, volinfo->volname, snapname, dict, &device); - /* continue with the snapshot even though snapshot - on one of the bricks fails. At the end check - whether the snapshot volume meets quorum or not. - If so, then the snapshot can be treated as success. - If not, undo the changes and return failure to cli. + /* Fail the snapshot even though snapshot on one of + the bricks fails. At the end when we check whether + the snapshot volume meets quorum or not, then the + the snapshot can either be treated as success, or + in case of failure we can undo the changes and return + failure to cli. */ - if (ret) - continue; + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to take snapshot of %s:%s", + brickinfo->hostname, brickinfo->path); + goto out; + } /* create the complete brick here */ ret = glusterd_snap_brick_create (device, snap_volume, @@ -3181,6 +3236,19 @@ glusterd_do_snap (glusterd_volinfo_t *volinfo, char *snapname, dict_t *dict, snap_volume->status = GLUSTERD_STATUS_STARTED; + ret = glusterd_store_perform_snap_volume_store (volinfo, snap_volume); + if (ret) { + gf_log ("", GF_LOG_ERROR, "Failed to store snapshot volinfo (%s) for volume " + "%s", snap_volume->volname, volinfo->volname); + goto out; + } + + ret = glusterd_volume_compute_cksum (volinfo, snap_volume); + if (ret) { + gf_log ("", GF_LOG_ERROR, "Failed to compute cksum for %s", snap_volume->volname); + goto out; + } + out: if (ret) glusterd_volinfo_delete (snap_volume); diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h index 27472c061..69ee30dd3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.h +++ b/xlators/mgmt/glusterd/src/glusterd-store.h @@ -153,4 +153,7 @@ int32_t glusterd_store_snap_cg (glusterd_snap_cg_t *cg); int32_t glusterd_store_delete_snap_cg (glusterd_snap_cg_t *cg); +int32_t +glusterd_store_perform_snap_volume_store (glusterd_volinfo_t *volinfo, + glusterd_volinfo_t *snap_volinfo); #endif diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index e9df28b8f..545d8bc38 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -2065,8 +2065,10 @@ glusterd_volume_compute_cksum (glusterd_volinfo_t *volinfo, if (ret) goto out; - volinfo->cksum = cksum; - + if (snap_volinfo) + snap_volinfo->cksum = cksum; + else + volinfo->cksum = cksum; out: if (fd > 0) close (fd); -- cgit