diff options
author | Ashish Pandey <aspandey@redhat.com> | 2017-07-04 16:18:20 +0530 |
---|---|---|
committer | Xavier Hernandez <xhernandez@datalab.es> | 2017-07-07 06:13:13 +0000 |
commit | 0ae38df6403942a2438404d46a6e05b503db3485 (patch) | |
tree | 065a8ef5d6c507d7ff230fad1cc74ab9bd59cb11 | |
parent | 45517ad2439118cebef63390b82a5e94c5b83ee8 (diff) |
cluster/ec : Don't try to heal when no sink is UP
Problem:
4 + 2 EC volume configuration.
If untar of linux is going on and we kill a brick,
indices will be created for the files/dir which need
to be healed. ec_shd_index_sweep spawns threads to
scan these entries and start heal. If in the middle
of this we kill one more brick, we end up in a
situation where we can not heal an entry as there
are only "ec->fragment" number of bricks are UP.
However, the scan will be continued and it will
trigger the heal for those entries.
Solution:
When a heal is triggered for an entry, check if it
*CAN* be healed or not. If not come out with ENOTCONN.
Change-Id: I305be7701c289f36bd7bde22491b71074771424f
BUG: 1464359
Signed-off-by: Ashish Pandey <aspandey@redhat.com>
Reviewed-on: https://review.gluster.org/17692
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Reviewed-by: Sunil Kumar Acharya <sheggodu@redhat.com>
Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
-rw-r--r-- | xlators/cluster/ec/src/ec-heald.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/xlators/cluster/ec/src/ec-heald.c b/xlators/cluster/ec/src/ec-heald.c index ffb78d5e950..2e8ece8e3f7 100644 --- a/xlators/cluster/ec/src/ec-heald.c +++ b/xlators/cluster/ec/src/ec-heald.c @@ -199,6 +199,9 @@ ec_shd_index_heal (xlator_t *subvol, gf_dirent_t *entry, loc_t *parent, int ret = 0; ec = healer->this->private; + if (ec->xl_up_count <= ec->fragments) { + return -ENOTCONN; + } if (!ec->shd.enabled) return -EBUSY; @@ -281,6 +284,9 @@ ec_shd_full_heal (xlator_t *subvol, gf_dirent_t *entry, loc_t *parent, int ret = 0; ec = this->private; + if (ec->xl_up_count <= ec->fragments) { + return -ENOTCONN; + } if (!ec->shd.enabled) return -EBUSY; |