summaryrefslogtreecommitdiffstats
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-26 03:47:48 -0700
commite883e98998404a9e1ef18516d88520cfe2451b3f (patch)
treeb5c31738e08b267d2c93815b9ed5245fe1b5067d
parentc9d462dc8c1250c3f3f42ca149bb062fe690335b (diff)
snapshot:cleanup snaps during unprobe
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: 1203185 Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com> Reviewed-on: http://review.gluster.org/9930 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Avra Sengupta <asengupt@redhat.com> Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-sm.c9
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c89
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h5
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-snapshot.c23
4 files changed, 104 insertions, 22 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.c b/xlators/mgmt/glusterd/src/glusterd-sm.c
index ce2110aef61..d99662af584 100644
--- a/xlators/mgmt/glusterd/src/glusterd-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-sm.c
@@ -631,6 +631,15 @@ glusterd_peer_detach_cleanup (glusterd_conf_t *priv)
gf_msg (THIS->name, GF_LOG_INFO, 0,
GD_MSG_STALE_VOL_DELETE_INFO,
"Deleting stale volume %s", volinfo->volname);
+
+ ret = glusterd_cleanup_snaps_for_volume (volinfo);
+ if (ret) {
+ gf_msg (THIS->name, GF_LOG_ERROR, 0,
+ GD_MSG_VOL_DELETE_FAIL,
+ "Error deleting snapshots for volume %s",
+ volinfo->volname);
+ }
+
ret = glusterd_delete_volume (volinfo);
if (ret) {
gf_msg (THIS->name, GF_LOG_ERROR, 0,
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
index cf1c8f3be2a..23fae9add57 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
@@ -36,6 +36,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)
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h
index ce8d7d40731..63d39e868fb 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h
@@ -38,6 +38,11 @@ glusterd_snap_volinfo_restore (dict_t *dict, dict_t *rsp_dict,
glusterd_volinfo_t *new_volinfo,
glusterd_volinfo_t *snap_volinfo,
int32_t volcount);
+int32_t
+glusterd_snapobject_delete (glusterd_snap_t *snap);
+
+int32_t
+glusterd_cleanup_snaps_for_volume (glusterd_volinfo_t *volinfo);
int32_t
glusterd_missed_snapinfo_new (glusterd_missed_snap_info **missed_snapinfo);
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
index b18c4699b68..131f7dbbe16 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c
@@ -81,6 +81,7 @@ typedef struct snap_create_args_ snap_create_args_t;
then the snap device will be /dev/<group-name>/<snapname>.
This function takes care of building the path for the snap device.
*/
+
char *
glusterd_build_snap_device_path (char *device, char *snapname,
int32_t brickcount)
@@ -2956,28 +2957,6 @@ out:
}
int32_t
-glusterd_snapobject_delete (glusterd_snap_t *snap)
-{
- if (snap == NULL) {
- gf_msg(THIS->name, GF_LOG_WARNING, EINVAL,
- GD_MSG_INVALID_ENTRY, "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;
-}
-
-int32_t
glusterd_snap_remove (dict_t *rsp_dict,
glusterd_snap_t *snap,
gf_boolean_t remove_lvm,