glusterd/snapshot : Copy the quota config and cksum file before taking a snapshot

Quota config and cksum file needs to be copied before taking a
snapshot, so that when a snapshot is restored these files is
copied back to the original place, and the restored snap volume
can make use of these quota files.

Before taking a snapshot the quota files are copied to
/var/lib/glusterd/snaps/<snapname>/quota/

Change-Id: Id175f28d4ee47be64d7491c6aae81a1794928490
BUG: 1061685
Signed-off-by: Sachin Pandit <spandit@redhat.com>
Reviewed-on: http://review.gluster.org/7527
Reviewed-by: Vijaikumar Mallikarjuna <vmallika@redhat.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
Sachin Pandit 2014-04-26 14:06:47 +05:30 committed by Vijay Bellur
parent d12a77cb32
commit b3031351b0
3 changed files with 116 additions and 3 deletions

View File

@ -410,7 +410,6 @@ out:
return ret;
}
int32_t
glusterd_copy_geo_rep_files (glusterd_volinfo_t *origin_vol,
glusterd_volinfo_t *snap_vol, dict_t *rsp_dict)
@ -3714,6 +3713,13 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,
goto out;
}
ret = glusterd_copy_quota_files (origin_vol, snap_vol);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Failed to copy quota "
"config and cksum for volume %s", origin_vol->volname);
goto out;
}
ret = generate_brick_volfiles (snap_vol);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "generating the brick "
@ -6068,7 +6074,16 @@ gd_restore_snap_volume (dict_t *rsp_dict,
ret = glusterd_restore_geo_rep_files (snap_vol);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Failed to restore "
"geo-rep files");
"geo-rep files for snap %s",
snap_vol->snapshot->snapname);
goto out;
}
ret = glusterd_copy_quota_files (snap_vol, orig_vol);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Failed to restore "
"quota files for snap %s",
snap_vol->snapshot->snapname);
goto out;
}

View File

@ -11618,6 +11618,8 @@ glusterd_copy_file (const char *source, const char *destination)
int src_fd = -1;
int dest_fd = -1;
int read_len = -1;
struct stat stbuf = {0,};
mode_t dest_mode = 0;
this = THIS;
GF_ASSERT (this);
@ -11625,6 +11627,15 @@ glusterd_copy_file (const char *source, const char *destination)
GF_ASSERT (source);
GF_ASSERT (destination);
/* Here is stat is made to get the file permission of source file*/
ret = lstat (source, &stbuf);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "%s not found", source);
goto out;
}
dest_mode = stbuf.st_mode & 0777;
src_fd = open (source, O_RDONLY);
if (src_fd < 0) {
ret = -1;
@ -11633,7 +11644,7 @@ glusterd_copy_file (const char *source, const char *destination)
goto out;
}
dest_fd = open (destination, O_CREAT | O_RDWR, 755);
dest_fd = open (destination, O_CREAT | O_RDWR, dest_mode);
if (dest_fd < 0) {
ret = -1;
gf_log (this->name, GF_LOG_ERROR,
@ -11805,6 +11816,89 @@ out:
return ret;
}
int32_t
glusterd_copy_quota_files (glusterd_volinfo_t *src_vol,
glusterd_volinfo_t *dest_vol) {
int32_t ret = -1;
char src_dir[PATH_MAX] = "";
char dest_dir[PATH_MAX] = "";
char src_path[PATH_MAX] = "";
char dest_path[PATH_MAX] = "";
xlator_t *this = NULL;
glusterd_conf_t *priv = NULL;
struct stat stbuf = {0,};
this = THIS;
GF_ASSERT (this);
priv = this->private;
GF_ASSERT (priv);
GF_ASSERT (src_vol);
GF_ASSERT (dest_vol);
GLUSTERD_GET_VOLUME_DIR (src_dir, src_vol, priv);
GLUSTERD_GET_VOLUME_DIR (dest_dir, dest_vol, priv);
ret = snprintf (src_path, sizeof (src_path), "%s/quota.conf",
src_dir);
if (ret < 0)
goto out;
/* quota.conf is not present if quota is not enabled, Hence ignoring
* the absence of this file
*/
ret = lstat (src_path, &stbuf);
if (ret) {
ret = 0;
gf_log (this->name, GF_LOG_DEBUG, "%s not found", src_path);
goto out;
}
ret = snprintf (dest_path, sizeof (dest_path), "%s/quota.conf",
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;
}
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;
}
out:
return ret;
}
int32_t
glusterd_restore_geo_rep_files (glusterd_volinfo_t *snap_vol)

View File

@ -773,4 +773,8 @@ glusterd_get_geo_rep_session (char *slave_key, char *origin_volname,
int32_t
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);
#endif