diff options
author | Atin Mukherjee <amukherj@redhat.com> | 2016-06-09 18:22:43 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2016-07-04 04:49:18 -0700 |
commit | 1a21cfba8e7a5f4ac1b8a8c3b8e06574b237420d (patch) | |
tree | 53224000129215c9ccc29b0a9ba2f3b48890e74a /xlators | |
parent | 3aed8bbefe0078eca80dd3a53f005e7a94281424 (diff) |
glusterd: fail volume delete if one of the node is down
Backport of http://review.gluster.org/14681
Deleting a volume on a cluster where one of the node in the cluster is down is
buggy since once that node comes back the resync of the same volume will happen.
Till we bring in the soft delete feature tracked in
http://review.gluster.org/12963 this is a safe guard to block the volume
deletion.
Please note the test file which is backported from this commit has an issue
where we start the volume and then try to delete it which is anyway going to
fail. So the test actually doesn't validate the fix.
http://review.gluster.org/#/c/14693/ in master fixed the problem and the same is
ported as part of this commit as well.
Change-Id: I9c13869c4a7e7a947f88842c6dc6f231c0eeda6c
BUG: 1344634
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-on: http://review.gluster.org/14681
Smoke: Gluster Build System <jenkins@build.gluster.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kaushal M <kaushal@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-on: http://review.gluster.org/14692
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Prashanth Pai <ppai@redhat.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-peer-utils.c | 29 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-peer-utils.h | 3 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 6 |
3 files changed, 38 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-peer-utils.c b/xlators/mgmt/glusterd/src/glusterd-peer-utils.c index 607ad3d38be..4131296ef12 100644 --- a/xlators/mgmt/glusterd/src/glusterd-peer-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-peer-utils.c @@ -394,6 +394,35 @@ gd_peer_uuid_str (glusterd_peerinfo_t *peerinfo) } gf_boolean_t +glusterd_are_all_peers_up () +{ + glusterd_peerinfo_t *peerinfo = NULL; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + gf_boolean_t peers_up = _gf_false; + + this = THIS; + GF_VALIDATE_OR_GOTO ("glusterd", this, out); + + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, conf, out); + + rcu_read_lock (); + cds_list_for_each_entry_rcu (peerinfo, &conf->peers, uuid_list) { + if (!peerinfo->connected) { + rcu_read_unlock (); + goto out; + } + } + rcu_read_unlock (); + + peers_up = _gf_true; + +out: + return peers_up; +} + +gf_boolean_t glusterd_are_vol_all_peers_up (glusterd_volinfo_t *volinfo, struct cds_list_head *peers, char **down_peerstr) diff --git a/xlators/mgmt/glusterd/src/glusterd-peer-utils.h b/xlators/mgmt/glusterd/src/glusterd-peer-utils.h index bd30e335f69..9332cf2ea02 100644 --- a/xlators/mgmt/glusterd/src/glusterd-peer-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-peer-utils.h @@ -43,6 +43,9 @@ char* gd_peer_uuid_str (glusterd_peerinfo_t *peerinfo); gf_boolean_t +glusterd_are_all_peers_up (); + +gf_boolean_t glusterd_are_vol_all_peers_up (glusterd_volinfo_t *volinfo, struct cds_list_head *peers, char **down_peerstr); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index ed5cd20bb1a..c62474376ea 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -1747,6 +1747,12 @@ glusterd_op_stage_delete_volume (dict_t *dict, char **op_errstr) goto out; } + if (!glusterd_are_all_peers_up ()) { + ret = -1; + snprintf (msg, sizeof(msg), "Some of the peers are down"); + goto out; + } + ret = 0; out: |