diff options
author | Mohammed Rafi KC <rkavunga@redhat.com> | 2015-03-17 19:57:47 +0530 |
---|---|---|
committer | Rajesh Joseph <rjoseph@redhat.com> | 2015-08-26 03:47:48 -0700 |
commit | e883e98998404a9e1ef18516d88520cfe2451b3f (patch) | |
tree | b5c31738e08b267d2c93815b9ed5245fe1b5067d /xlators | |
parent | c9d462dc8c1250c3f3f42ca149bb062fe690335b (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>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-sm.c | 9 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c | 89 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot-utils.h | 5 | ||||
-rw-r--r-- | 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/<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, |