diff options
author | Sachin Pandit <spandit@redhat.com> | 2015-03-16 13:12:12 +0530 |
---|---|---|
committer | Krishnan Parthasarathi <kparthas@redhat.com> | 2015-04-10 08:19:09 +0000 |
commit | da48df4e91b69b8f586d658de9573287cad2ce64 (patch) | |
tree | 5046c2ad5de3fbd22cc99879cd52dce8f904f36c /xlators | |
parent | df26c5e162b2ff413ff551119346e239df5ed663 (diff) |
glusterd/snapshot : While snapshot restore, compute quota checksum.
Problem : During snapshot restore we anyways copy the quota conf file
after that we need to compute the checksum for that. If not, there
might be a checksum mismatch during glusterd handshake.
Solution : Compute a checksum file for quota conf file if its
present.
Change-Id: Ic4a6567c6ede9923443abf4ca59380679be88094
BUG: 1202436
Signed-off-by: Sachin Pandit <spandit@redhat.com>
Reviewed-on: http://review.gluster.org/9901
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Tested-by: Krishnan Parthasarathi <kparthas@redhat.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c | 31 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h | 3 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 27 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 1 |
4 files changed, 30 insertions, 32 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c index 8819f69c594..1da8a5b4490 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c @@ -3054,7 +3054,8 @@ out: int32_t glusterd_copy_quota_files (glusterd_volinfo_t *src_vol, - glusterd_volinfo_t *dest_vol) { + glusterd_volinfo_t *dest_vol, + gf_boolean_t *conf_present) { int32_t ret = -1; char src_dir[PATH_MAX] = ""; @@ -3104,33 +3105,7 @@ glusterd_copy_quota_files (glusterd_volinfo_t *src_vol, goto out; } - ret = snprintf (src_path, sizeof (src_path), "%s/quota.cksum", - src_dir); - if (ret < 0) - goto out; - - /* If quota.conf is present and quota.cksum is not present, then - * that scenario is considered as invalid, hence error out. - */ - ret = lstat (src_path, &stbuf); - if (ret) { - ret = -1; - gf_log (this->name, GF_LOG_ERROR, "%s not found", src_path); - goto out; - } - - ret = snprintf (dest_path, sizeof (dest_path), "%s/quota.cksum", - dest_dir); - if (ret < 0) - goto out; - - ret = glusterd_copy_file (src_path, dest_path); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, "Failed to copy %s in %s", - src_path, dest_path); - goto out; - } - + *conf_present = _gf_true; out: return ret; diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h index 07a9709b65f..68906dcf59e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h @@ -96,7 +96,8 @@ glusterd_restore_geo_rep_files (glusterd_volinfo_t *snap_vol); int32_t glusterd_copy_quota_files (glusterd_volinfo_t *src_vol, - glusterd_volinfo_t *dest_vol); + glusterd_volinfo_t *dest_vol, + gf_boolean_t *conf_present); int glusterd_snap_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict); diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 6d1f79b65d0..cdd19cd354d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -4707,7 +4707,8 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap, int32_t brick_count = 0; xlator_t *this = NULL; int64_t brick_order = 0; - char *clonename = NULL; + char *clonename = NULL; + gf_boolean_t conf_present = _gf_false; this = THIS; GF_ASSERT (this); @@ -4834,7 +4835,7 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap, goto out; } - ret = glusterd_copy_quota_files (origin_vol, snap_vol); + ret = glusterd_copy_quota_files (origin_vol, snap_vol, &conf_present); if (ret) { gf_log (this->name, GF_LOG_ERROR, "Failed to copy quota " "config and cksum for volume %s", origin_vol->volname); @@ -8781,6 +8782,7 @@ gd_restore_snap_volume (dict_t *dict, dict_t *rsp_dict, glusterd_conf_t *conf = NULL; glusterd_volinfo_t *temp_volinfo = NULL; glusterd_volinfo_t *voliter = NULL; + gf_boolean_t conf_present = _gf_false; this = THIS; GF_ASSERT (this); @@ -8870,7 +8872,7 @@ gd_restore_snap_volume (dict_t *dict, dict_t *rsp_dict, snap_vol->snapshot->snapname); } - ret = glusterd_copy_quota_files (snap_vol, orig_vol); + ret = glusterd_copy_quota_files (snap_vol, orig_vol, &conf_present); if (ret) { gf_log (this->name, GF_LOG_ERROR, "Failed to restore " "quota files for snap %s", @@ -8878,6 +8880,25 @@ gd_restore_snap_volume (dict_t *dict, dict_t *rsp_dict, goto out; } + if (conf_present) { + /* TO calculate checksum of quota conf we need to send + * second argument as _gf_true + */ + ret = glusterd_compute_cksum (new_volinfo, _gf_true); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to compute " + "checksum for quota conf file"); + goto out; + } + + ret = glusterd_store_save_quota_version_and_cksum (new_volinfo); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to " + "store quota version and cksum"); + goto out; + } + } + /* New volinfo always shows the status as created. Therefore * set the status to the original volume's status. */ glusterd_set_volume_status (new_volinfo, orig_vol->status); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 4863733f84c..468b3c0af45 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -560,6 +560,7 @@ glusterd_volinfo_dup (glusterd_volinfo_t *volinfo, new_volinfo->transport_type = volinfo->transport_type; new_volinfo->brick_count = volinfo->brick_count; new_volinfo->tier_info = volinfo->tier_info; + new_volinfo->quota_conf_version = volinfo->quota_conf_version; dict_copy (volinfo->dict, new_volinfo->dict); dict_copy (volinfo->gsync_slaves, new_volinfo->gsync_slaves); |