summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
diff options
context:
space:
mode:
authorMohammed Rafi KC <rkavunga@redhat.com>2015-03-17 19:57:47 +0530
committerRajesh Joseph <rjoseph@redhat.com>2015-08-31 23:39:43 -0700
commitc00872cbff0ec2d7472d7c191e817f4e55f4ec9f (patch)
tree5832bff5c944770d74a50e49d4cea568f3b45cb5 /xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
parentb60f931e8e2479d9a93e568b358feb24f52a864b (diff)
snapshot:cleanup snaps during unprobe
Backport of http://review.gluster.org/#/c/9930/ When doing an unprobe, the volume that doesnot contain any brick of the particular node will be deleted. So the snaps associated with that volume should also delete Change-Id: I9f3d23bd11b254ebf7d7722cc1e12455d6b024ff BUG: 1255384 Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com> Reviewed-on: http://review.gluster.org/11970 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
index 8a111f23c94..a535c2a898f 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
@@ -40,6 +40,95 @@
* This function restores the atime and mtime of marker.tstamp
* if present from snapped marker.tstamp file.
*/
+
+int32_t
+glusterd_snapobject_delete (glusterd_snap_t *snap)
+{
+ if (snap == NULL) {
+ gf_msg(THIS->name, GF_LOG_WARNING, 0,
+ GD_MSG_PARAM_NULL, "snap is NULL");
+ return -1;
+ }
+
+ cds_list_del_init (&snap->snap_list);
+ cds_list_del_init (&snap->volumes);
+ if (LOCK_DESTROY(&snap->lock))
+ gf_msg (THIS->name, GF_LOG_WARNING, 0,
+ GD_MSG_LOCK_DESTROY_FAILED,
+ "Failed destroying lock"
+ "of snap %s", snap->snapname);
+
+ GF_FREE (snap->description);
+ GF_FREE (snap);
+
+ return 0;
+}
+
+
+/*
+ * This function is to be called only from glusterd_peer_detach_cleanup()
+ * as this continues to delete snaps inspite of faiure while deleting
+ * one, as we don't want to fail peer_detach in such a case.
+ */
+int
+glusterd_cleanup_snaps_for_volume (glusterd_volinfo_t *volinfo)
+{
+ int32_t op_ret = 0;
+ int32_t ret = 0;
+ xlator_t *this = NULL;
+ glusterd_volinfo_t *snap_vol = NULL;
+ glusterd_volinfo_t *dummy_snap_vol = NULL;
+ glusterd_snap_t *snap = NULL;
+
+ this = THIS;
+ GF_ASSERT (this);
+
+ cds_list_for_each_entry_safe (snap_vol, dummy_snap_vol,
+ &volinfo->snap_volumes,
+ snapvol_list) {
+ ret = glusterd_store_delete_volume (snap_vol);
+ if (ret) {
+ gf_msg(this->name, GF_LOG_WARNING, 0,
+ GD_MSG_VOL_DELETE_FAIL, "Failed to remove "
+ "volume %s from store", snap_vol->volname);
+ op_ret = ret;
+ continue;
+ }
+
+ ret = glusterd_volinfo_delete (snap_vol);
+ if (ret) {
+ gf_msg(this->name, GF_LOG_WARNING, 0,
+ GD_MSG_VOL_DELETE_FAIL, "Failed to remove "
+ "volinfo %s ", snap_vol->volname);
+ op_ret = ret;
+ continue;
+ }
+
+ snap = snap_vol->snapshot;
+ ret = glusterd_store_delete_snap (snap);
+ if (ret) {
+ gf_msg(this->name, GF_LOG_WARNING, 0,
+ GD_MSG_VOL_DELETE_FAIL, "Failed to remove "
+ "snap %s from store", snap->snapname);
+ op_ret = ret;
+ continue;
+ }
+
+ ret = glusterd_snapobject_delete (snap);
+ if (ret) {
+ gf_msg (this->name, GF_LOG_WARNING, 0,
+ GD_MSG_VOL_DELETE_FAIL, "Failed to delete "
+ "snap object %s", snap->snapname);
+ op_ret = ret;
+ continue;
+ }
+ }
+
+ return op_ret;
+}
+
+
+
int
glusterd_snap_geo_rep_restore (glusterd_volinfo_t *snap_volinfo,
glusterd_volinfo_t *new_volinfo)