diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2019-04-04 12:23:11 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2019-04-05 09:48:50 +0000 |
commit | 443cb74587c251fecbcdfa119a3620ff01131a36 (patch) | |
tree | 093fb0747605cf574e3823702a2b9578f0eb57bc | |
parent | 0e067fa663dcfdafa093c4a5fa8bdc47eb57cbe0 (diff) |
cluster/afr: Invalidate inode on change of split-brain-choice
When split-brain choice is changed from one brick to another
brick, inode-invalidate is not called so readv call is served
from cache leading to failures in split-brain-resolution.t.
Fixed it by calling inode_invaldate() when this happens.
updates bz#1193929
Change-Id: I2624614eec38c0303f3e1dc55dfae3d4b864218b
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
-rw-r--r-- | tests/basic/afr/split-brain-resolution.t | 12 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 5 |
2 files changed, 13 insertions, 4 deletions
diff --git a/tests/basic/afr/split-brain-resolution.t b/tests/basic/afr/split-brain-resolution.t index a88c47de7a7..834237c96ec 100644 --- a/tests/basic/afr/split-brain-resolution.t +++ b/tests/basic/afr/split-brain-resolution.t @@ -74,6 +74,18 @@ TEST setfattr -n replica.split-brain-choice -v none $M0/data-split-brain.txt TEST ! getfattr -n user.test $M0/metadata-split-brain.txt TEST ! cat $M0/data-split-brain.txt +#Check that after timeout fops result in EIO again. +#Set one minute timeout +TEST setfattr -n replica.split-brain-choice-timeout -v 1 $M0/ +TEST setfattr -n replica.split-brain-choice -v $V0-client-1 $M0/data-split-brain.txt +EXPECT "brick1_alive" cat $M0/data-split-brain.txt +TEST setfattr -n replica.split-brain-choice -v $V0-client-0 $M0/metadata-split-brain.txt +EXPECT "brick0" get_text_xattr user.test $M0/metadata-split-brain.txt +#Wait until timeout completes and test that the fops fail again +sleep 62 +TEST ! getfattr -n user.test $M0/metadata-split-brain.txt +TEST ! cat $M0/data-split-brain.txt + #Negative test cases should fail TEST ! setfattr -n replica.split-brain-choice -v $V0-client-4 $M0/data-split-brain.txt TEST ! setfattr -n replica.split-brain-heal-finalize -v $V0-client-4 $M0/metadata-split-brain.txt diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 8c8cc0cb242..9adab10c399 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -820,7 +820,6 @@ afr_set_split_brain_choice(int ret, call_frame_t *frame, void *opaque) gf_boolean_t timer_set = _gf_false; gf_boolean_t timer_cancelled = _gf_false; gf_boolean_t timer_reset = _gf_false; - gf_boolean_t need_invalidate = _gf_true; int old_spb_choice = -1; frame = data->frame; @@ -932,7 +931,6 @@ afr_set_split_brain_choice(int ret, call_frame_t *frame, void *opaque) timer_set = _gf_true; if (timer_reset && !ctx->timer) timer_cancelled = _gf_true; - need_invalidate = _gf_false; } unlock: UNLOCK(&inode->lock); @@ -946,8 +944,7 @@ post_unlock: * reads from an older cached value despite a change in spb_choice to * a new value. */ - if (need_invalidate) - inode_invalidate(inode); + inode_invalidate(inode); out: GF_FREE(data); AFR_STACK_UNWIND(setxattr, frame, ret, op_errno, NULL); |