diff options
author | Ravishankar N <ravishankar@redhat.com> | 2015-08-07 12:52:23 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2015-08-12 05:35:06 -0700 |
commit | b95d40bfd760525f0c3e1cf0a11a8087c17a7110 (patch) | |
tree | 846827838e93d12dc1d6238b6fee0b1c76a48d76 | |
parent | e4726e843574c0db108fce1fc375241b72d7aed4 (diff) |
afr: Do not wind statfs to arbiter brick
Backport of: http://review.gluster.org/#/c/11857/
Problem: AFR serves statfs from the brick having the least free space
available. Since the size to be allocated to the arbiter brick in a 3
way replica is supposed to be considerably lesser than the other 2
bricks, statfs will be served from this brick which is incorrect.
Fix: Don't serve statfs from the arbiter brick.
Change-Id: Ia2d2402ba1e8f5d96831f71b3f8337f241e6753b
BUG: 1251380
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/11858
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 9 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 2 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 2 |
3 files changed, 8 insertions, 5 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 31c6eff1fa8..bbc870aa671 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -650,7 +650,7 @@ afr_accuse_smallfiles (xlator_t *this, struct afr_reply *replies, for (i = 0; i < priv->child_count; i++) { if (data_accused[i]) continue; - if ((priv->arbiter_count == 1) && (i == ARBITER_BRICK_INDEX)) + if (AFR_IS_ARBITER_BRICK(priv, i)) continue; if (replies[i].poststat.ia_size < maxsize) data_accused[i] = 1; @@ -1737,8 +1737,7 @@ afr_local_discovery_cbk (call_frame_t *frame, void *cookie, xlator_t *this, */ if (is_local) { /* Don't set arbiter as read child. */ - if ((priv->arbiter_count == 1) && - (child_index == ARBITER_BRICK_INDEX)) + if (AFR_IS_ARBITER_BRICK(priv, child_index)) goto out; gf_msg (this->name, GF_LOG_INFO, 0, AFR_MSG_LOCAL_CHILD, "selecting local read_child %s", @@ -3621,6 +3620,8 @@ afr_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) if (!local) goto out; + if (priv->arbiter_count == 1 && local->child_up[ARBITER_BRICK_INDEX]) + local->call_count--; call_count = local->call_count; if (!call_count) { op_errno = ENOTCONN; @@ -3629,6 +3630,8 @@ afr_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) for (i = 0; i < priv->child_count; i++) { if (local->child_up[i]) { + if (AFR_IS_ARBITER_BRICK(priv, i)) + continue; STACK_WIND (frame, afr_statfs_cbk, priv->children[i], priv->children[i]->fops->statfs, diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index f4aae3f5931..3245cfd6e9c 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -685,7 +685,7 @@ __afr_selfheal_data (call_frame_t *frame, xlator_t *this, fd_t *fd, source = ret; - if (priv->arbiter_count == 1 && source == ARBITER_BRICK_INDEX && + if (AFR_IS_ARBITER_BRICK(priv, source) && AFR_COUNT (sources, priv->child_count) == 1) { did_sh = _gf_false; goto unlock; diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 729ae82f08c..2c225cd6462 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -54,7 +54,7 @@ typedef int (*afr_changelog_resume_t) (call_frame_t *frame, xlator_t *this); #define AFR_COUNT(array,max) ({int __i; int __res = 0; for (__i = 0; __i < max; __i++) if (array[__i]) __res++; __res;}) #define AFR_INTERSECT(dst,src1,src2,max) ({int __i; for (__i = 0; __i < max; __i++) dst[__i] = src1[__i] && src2[__i];}) #define AFR_CMP(a1,a2,len) ({int __cmp = 0; int __i; for (__i = 0; __i < len; __i++) if (a1[__i] != a2[__i]) { __cmp = 1; break;} __cmp;}) - +#define AFR_IS_ARBITER_BRICK(priv, index) ((priv->arbiter_count == 1) && (index == ARBITER_BRICK_INDEX)) typedef struct _afr_private { gf_lock_t lock; /* to guard access to child_count, etc */ unsigned int child_count; /* total number of children */ |