diff options
| author | Pranith Kumar K <pkarampu@redhat.com> | 2014-10-28 11:48:02 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2014-11-16 23:07:21 -0800 | 
| commit | 6fbb140c293dcabaf6ec34315d7cc94de07c0782 (patch) | |
| tree | 64ee8a94319040d9d19870c8af115596ad9c0fd3 | |
| parent | 3df2cbdf32891237fee360e2003c2f659d08f63e (diff) | |
cluster/afr: Preserve errno in case of failures on all subvols
        Backport of http://review.gluster.org/8984
Problem:
When quorum is enabled and the fop fails on all the subvolumes,
op_errno is set to EROFS which overrides the actual errno returned
from bricks.
Fix:
Don't override the errno when fop fails on all subvols.
Change-Id: I61e57bbf1a69407230ec172a983de18d1c624fd2
BUG: 1162122
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/9087
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 21 | 
1 files changed, 16 insertions, 5 deletions
diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index d287e6ab66c..bb582b5940f 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -507,6 +507,10 @@ afr_handle_quorum (call_frame_t *frame)          if (priv->quorum_count == 0)                  return; +        /* If the fop already failed return right away to preserve errno */ +        if (local->op_ret == -1) +                return; +          /*           * Network split may happen just after the fops are unwound, so check           * if the fop succeeded in a way it still follows quorum. If it doesn't, @@ -975,16 +979,23 @@ afr_changelog_pre_op (call_frame_t *frame, xlator_t *this)  		}  	} -        if (priv->quorum_count && !afr_has_fop_quorum (frame)) { -                op_errno = EROFS; -                goto err; -        } - +        /* This condition should not be met with present code, as +         * transaction.done will be called if locks are not acquired on even a +         * single node. +         */          if (call_count == 0) {  		op_errno = ENOTCONN;  		goto err;  	} +        /* Check if the fop can be performed on at least +         * quorum number of nodes. +         */ +        if (priv->quorum_count && !afr_has_fop_quorum (frame)) { +                op_errno = EROFS; +                goto err; +        } +  	xdata_req = dict_new();  	if (!xdata_req) {  		op_errno = ENOMEM;  | 
