diff options
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-locks.c | 11 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 30 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 2 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 3 |
5 files changed, 42 insertions, 6 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-locks.c b/xlators/mgmt/glusterd/src/glusterd-locks.c index cc9c03f5683..1e99117b3a1 100644 --- a/xlators/mgmt/glusterd/src/glusterd-locks.c +++ b/xlators/mgmt/glusterd/src/glusterd-locks.c @@ -790,6 +790,7 @@ glusterd_mgmt_v3_unlock (const char *name, uuid_t uuid, char *type) int32_t ret = -1; gf_boolean_t is_valid = _gf_true; glusterd_conf_t *priv = NULL; + glusterd_volinfo_t *volinfo = NULL; glusterd_mgmt_v3_lock_timer *mgmt_lock_timer = NULL; uuid_t owner = {0}; xlator_t *this = NULL; @@ -888,7 +889,6 @@ glusterd_mgmt_v3_unlock (const char *name, uuid_t uuid, char *type) "Lock for %s %s successfully released", type, name); - ret = 0; /* Release owner reference which was held during lock */ if (mgmt_lock_timer->timer) { ret = -1; @@ -905,6 +905,15 @@ glusterd_mgmt_v3_unlock (const char *name, uuid_t uuid, char *type) mgmt_lock_timer->timer); dict_del (priv->mgmt_v3_lock_timer, key_dup); } + ret = glusterd_volinfo_find (name, &volinfo); + if (volinfo && volinfo->stage_deleted) { + /* this indicates a volume still exists and the volume delete + * operation has failed in some of the phases, need to ensure + * stage_deleted flag is set back to false + */ + volinfo->stage_deleted = _gf_false; + } + ret = 0; out: gf_msg_trace (this->name, 0, "Returning %d", ret); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 5afeebac78b..362d3b6adc4 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1718,7 +1718,7 @@ glusterd_volinfo_find_by_volume_id (uuid_t volume_id, glusterd_volinfo_t **volin } int32_t -glusterd_volinfo_find (char *volname, glusterd_volinfo_t **volinfo) +glusterd_volinfo_find (const char *volname, glusterd_volinfo_t **volinfo) { glusterd_volinfo_t *tmp_volinfo = NULL; int32_t ret = -1; @@ -3016,6 +3016,11 @@ glusterd_add_volume_to_dict (glusterd_volinfo_t *volinfo, if (ret) goto out; + snprintf (key, sizeof (key), "%s%d.stage_deleted", prefix, count); + ret = dict_set_uint32 (dict, key, (uint32_t)volinfo->stage_deleted); + if (ret) + goto out; + /* tiering related variables */ snprintf (key, sizeof (key), "%s%d.cold_brick_count", prefix, count); @@ -3390,6 +3395,7 @@ glusterd_compare_friend_volume (dict_t *peer_data, int32_t count, uint32_t cksum = 0; uint32_t quota_cksum = 0; uint32_t quota_version = 0; + uint32_t stage_deleted = 0; int32_t version = 0; xlator_t *this = NULL; @@ -3405,9 +3411,15 @@ glusterd_compare_friend_volume (dict_t *peer_data, int32_t count, goto out; ret = glusterd_volinfo_find (volname, &volinfo); - if (ret) { - *status = GLUSTERD_VOL_COMP_UPDATE_REQ; + snprintf (key, sizeof (key), "volume%d.stage_deleted", count); + ret = dict_get_uint32 (peer_data, key, &stage_deleted); + /* stage_deleted = 1 means the volume is still in the process of + * deleting a volume, so we shouldn't be trying to create a + * fresh volume here which would lead to a stale entry + */ + if (stage_deleted == 0) + *status = GLUSTERD_VOL_COMP_UPDATE_REQ; ret = 0; goto out; } @@ -3949,6 +3961,7 @@ glusterd_import_volinfo (dict_t *peer_data, int count, char *rebalance_id_str = NULL; int op_version = 0; int client_op_version = 0; + uint32_t stage_deleted = 0; GF_ASSERT (peer_data); GF_ASSERT (volinfo); @@ -3961,6 +3974,17 @@ glusterd_import_volinfo (dict_t *peer_data, int count, goto out; } + snprintf (key, sizeof (key), "%s%d.stage_deleted", prefix, count); + ret = dict_get_uint32 (peer_data, key, &stage_deleted); + /* stage_deleted = 1 means the volume is still in the process of + * deleting a volume, so we shouldn't be trying to create a + * fresh volume here which would lead to a stale entry + */ + if (stage_deleted) { + ret = 0; + goto out; + } + ret = glusterd_volinfo_new (&new_volinfo); if (ret) goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index eded8e231d4..97f3cc6edf0 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -158,7 +158,7 @@ glusterd_brickinfo_new_from_brick (char *brick, char **op_errstr); int32_t -glusterd_volinfo_find (char *volname, glusterd_volinfo_t **volinfo); +glusterd_volinfo_find (const char *volname, glusterd_volinfo_t **volinfo); int glusterd_volinfo_find_by_volume_id (uuid_t volume_id, glusterd_volinfo_t **volinfo); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index 4c1f0be3d06..70a871fcef1 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -1851,7 +1851,7 @@ glusterd_op_stage_delete_volume (dict_t *dict, char **op_errstr) snprintf (msg, sizeof(msg), "Some of the peers are down"); goto out; } - + volinfo->stage_deleted = _gf_true; ret = 0; out: diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 49a1dc6dc08..e0864c04148 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -489,6 +489,9 @@ struct glusterd_volinfo_ { glusterd_tierdsvc_t tierd; glusterd_gfproxydsvc_t gfproxyd; int32_t quota_xattr_version; + gf_boolean_t stage_deleted; /* volume has passed staging + * for delete operation + */ }; typedef enum gd_snap_status_ { |