From e883e98998404a9e1ef18516d88520cfe2451b3f Mon Sep 17 00:00:00 2001 From: Mohammed Rafi KC Date: Tue, 17 Mar 2015 19:57:47 +0530 Subject: 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 Reviewed-on: http://review.gluster.org/9930 Tested-by: NetBSD Build System Reviewed-by: Avra Sengupta Reviewed-by: Rajesh Joseph --- xlators/mgmt/glusterd/src/glusterd-sm.c | 9 +++ .../mgmt/glusterd/src/glusterd-snapshot-utils.c | 89 ++++++++++++++++++++++ .../mgmt/glusterd/src/glusterd-snapshot-utils.h | 5 ++ xlators/mgmt/glusterd/src/glusterd-snapshot.c | 23 +----- 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//. 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) @@ -2955,28 +2956,6 @@ out: return ret; } -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, -- cgit