summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/ec/src/ec-common.c
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2015-06-15 16:32:06 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2015-07-01 23:42:17 -0700
commitab74e66f1724d5ca8cfe15bd4d91a3b7da1c62bd (patch)
tree61394edc7c3c57b49e4ff7e00d3e02181f452090 /xlators/cluster/ec/src/ec-common.c
parentb5d5ae55a1d6a2dc290b23c9f6b640fcece48118 (diff)
cluster/ec: wind fops on good subvols for access/readdir[p]
Backport of http://review.gluster.com/11246 BUG: 1234679 Change-Id: I2d774f62740c82e922efab50fc78fa74050ede93 Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: http://review.gluster.org/11357 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Tested-by: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'xlators/cluster/ec/src/ec-common.c')
-rw-r--r--xlators/cluster/ec/src/ec-common.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c
index bafd45566a3..455df99c80c 100644
--- a/xlators/cluster/ec/src/ec-common.c
+++ b/xlators/cluster/ec/src/ec-common.c
@@ -190,6 +190,10 @@ void ec_update_bad(ec_fop_data_t * fop, uintptr_t good)
ec_t *ec = fop->xl->private;
uintptr_t bad;
+ /*Don't let fops that do dispatch_one() to update bad*/
+ if (fop->expected == 1)
+ return;
+
bad = ec->xl_up & ~(fop->remaining | good);
fop->bad |= bad;
fop->good |= good;
@@ -318,6 +322,20 @@ void ec_resume_parent(ec_fop_data_t * fop, int32_t error)
}
}
+gf_boolean_t
+ec_is_recoverable_error (int32_t op_errno)
+{
+ switch (op_errno) {
+ case ENOTCONN:
+ case ESTALE:
+ case ENOENT:
+ case EBADFD:/*Opened fd but brick is disconnected*/
+ case EIO:/*Backend-fs crash like XFS/ext4 etc*/
+ return _gf_true;
+ }
+ return _gf_false;
+}
+
void ec_complete(ec_fop_data_t * fop)
{
ec_cbk_data_t * cbk = NULL;
@@ -333,14 +351,12 @@ void ec_complete(ec_fop_data_t * fop)
if (!list_empty(&fop->cbk_list)) {
cbk = list_entry(fop->cbk_list.next, ec_cbk_data_t, list);
healing_count = ec_bits_count (cbk->mask & fop->healing);
+ /* fop shouldn't be treated as success if it is not
+ * successful on at least fop->minimum good copies*/
if ((cbk->count - healing_count) >= fop->minimum) {
- /* fop shouldn't be treated as success if it is not
- * successful on at least fop->minimum good copies*/
- if ((cbk->op_ret >= 0) || (cbk->op_errno != ENOTCONN)) {
- fop->answer = cbk;
+ fop->answer = cbk;
- update = 1;
- }
+ update = 1;
}
}