summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-snapshot.c
diff options
context:
space:
mode:
authorRajesh Joseph <rjoseph@redhat.com>2014-03-05 18:26:37 +0530
committerRajesh Joseph <rjoseph@redhat.com>2014-03-10 05:24:09 -0700
commit8f87071658ae8d0799f752a9f7f951fbd46ceda7 (patch)
tree33bf64697b10cb3ea71780ba45a913e2358a87be /xlators/mgmt/glusterd/src/glusterd-snapshot.c
parent586e1cabf850211b9e6856fcb8c42c696de6d484 (diff)
glusterd/snapshot: Modified restore backend
Now instead of creating volume store files first we constructing the in-memory volinfo first and then generate the backend store files. This gives lot of flexibility in restore operation. This patch also fixes the read-only issue with restored snaps. Change-Id: I51032228a5212fc3b90dc6e93f3539af3eb36074 BUG: 1064688 Signed-off-by: Rajesh Joseph <rjoseph@redhat.com> Reviewed-on: http://review.gluster.org/7209 Reviewed-by: Sachin Pandit <spandit@redhat.com> Reviewed-by: Vijaikumar Mallikarjuna <vmallika@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-snapshot.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
index 7960e84ac..2b2cc1adc 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
@@ -1191,6 +1191,7 @@ out:
int32_t
glusterd_snap_volume_remove (glusterd_volinfo_t *snap_vol,
+ gf_boolean_t remove_lvm,
gf_boolean_t force)
{
int ret = -1;
@@ -1223,13 +1224,17 @@ glusterd_snap_volume_remove (glusterd_volinfo_t *snap_vol,
goto out;
}
}
- ret = glusterd_lvm_snapshot_remove (snap_vol);
- if (ret) {
- gf_log(this->name, GF_LOG_WARNING, "Failed to remove "
- "lvm snapshot volume %s", snap_vol->volname);
- ret_1 = ret;
- if (!force)
- goto out;
+
+ /* Only remove the backend lvm when required */
+ if (remove_lvm) {
+ ret = glusterd_lvm_snapshot_remove (snap_vol);
+ if (ret) {
+ gf_log(this->name, GF_LOG_WARNING, "Failed to remove "
+ "lvm snapshot volume %s", snap_vol->volname);
+ ret_1 = ret;
+ if (!force)
+ goto out;
+ }
}
ret = glusterd_store_delete_volume (snap_vol);
@@ -1291,6 +1296,7 @@ glusterd_snapobject_delete (glusterd_snap_t *snap)
int32_t
glusterd_snap_remove (glusterd_snap_t *snap,
+ gf_boolean_t remove_lvm,
gf_boolean_t force)
{
int ret = -1;
@@ -1308,7 +1314,8 @@ glusterd_snap_remove (glusterd_snap_t *snap,
}
list_for_each_entry_safe (snap_vol, tmp, &snap->volumes, vol_list) {
- ret = glusterd_snap_volume_remove (snap_vol, force);
+ ret = glusterd_snap_volume_remove (snap_vol,
+ remove_lvm, force);
if (ret) {
gf_log(this->name, GF_LOG_WARNING, "Failed to remove "
"volinfo %s for snap %s", snap_vol->volname,
@@ -2538,7 +2545,7 @@ glusterd_create_snap_object (dict_t *dict)
out:
if (ret) {
if (snap)
- glusterd_snap_remove (snap, _gf_true);
+ glusterd_snap_remove (snap, _gf_true,_gf_true);
snap=NULL;
}
@@ -2906,7 +2913,11 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,
goto out;
}
- ret = glusterd_volinfo_dup (origin_vol, &snap_vol);
+ /* We are not setting the username and password here as
+ * we need to set the user name and password passed in
+ * the dictionary
+ */
+ ret = glusterd_volinfo_dup (origin_vol, &snap_vol, _gf_false);
if (ret) {
gf_log (this->name, GF_LOG_ERROR, "Failed to duplicate volinfo "
"for the snapshot %s", snap->snapname);
@@ -3056,7 +3067,8 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,
out:
if (ret) {
if (snap_vol)
- glusterd_snap_volume_remove (snap_vol, _gf_true);
+ glusterd_snap_volume_remove (snap_vol,
+ _gf_true, _gf_true);
snap_vol = NULL;
}
@@ -3252,7 +3264,7 @@ glusterd_snapshot_remove_commit (dict_t *dict, char **op_errstr,
goto out;
}
- ret = glusterd_snap_remove (snap, _gf_false);
+ ret = glusterd_snap_remove (snap, _gf_true, _gf_false);
if (ret){
gf_log (this->name, GF_LOG_ERROR, "Failed to remove snap %s",
snapname);
@@ -3369,7 +3381,7 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr,
out:
if (ret) {
if (snap)
- glusterd_snap_remove (snap, _gf_true);
+ glusterd_snap_remove (snap, _gf_true, _gf_true);
snap=NULL;
}