diff options
author | karthik-us <ksubrahm@redhat.com> | 2017-12-18 16:46:39 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2018-01-13 02:55:44 +0000 |
commit | ba149bac92d169ae2256dbc75202dc9e5d06538e (patch) | |
tree | 246c76c0dacfb4ef9813d2801a6e2c37cdf57c10 /xlators/cluster/afr/src/afr.h | |
parent | e9358bc4d275602529a4a0167ebaa053db3a0e1b (diff) |
cluster/afr: Fixing the flaws in arbiter becoming source patch
Problem:
Setting the write_subvol value to read_subvol in case of metadata
transaction during pre-op (commit 19f9bcff4aada589d4321356c2670ed283f02c03)
might lead to the original problem of arbiter becoming source.
Scenario:
1) All bricks are up and good
2) 2 writes w1 and w2 are in progress in parallel
3) ctx->read_subvol is good for all the subvolumes
4) w1 succeeds on brick0 and fails on brick1, yet to do post-op on
the disk
5) read/lookup comes on the same file and refreshes read_subvols back
to all good
6) metadata transaction happens which makes ctx->write_subvol to be
assigned with ctx->read_subvol which is all good
7) w2 succeeds on brick1 and fails on brick0 and this will update the
brick in reverse order leading to arbiter becoming source
Fix:
Instead of setting the ctx->write_subvol to ctx->read_subvol in the
pre-op statge, if there is a metadata transaction, check in the
function __afr_set_in_flight_sb_status() if it is a data/metadata
transaction. Use the value of ctx->write_subvol if it is a data
transactions and ctx->read_subvol value for other transactions.
With this patch we assign the value of ctx->write_subvol in the
afr_transaction_perform_fop() with the on disk value, instead of
assigning it in the afr_changelog_pre_op() with the in memory value.
Change-Id: Id2025a7e965f0578af35b1abaac793b019c43cc4
BUG: 1482064
Signed-off-by: karthik-us <ksubrahm@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr.h')
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 7a7cb2e656f..fb8b3b1d136 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -376,6 +376,16 @@ typedef enum { AFR_FOP_LOCK_QUORUM_FAILED, } afr_fop_lock_state_t; +typedef struct _afr_inode_ctx { + uint64_t read_subvol; + uint64_t write_subvol; + int lock_count; + int spb_choice; + gf_timer_t *timer; + gf_boolean_t need_refresh; +} afr_inode_ctx_t; + + typedef struct _afr_local { glusterfs_fop_t op; unsigned int call_count; @@ -832,17 +842,10 @@ typedef struct _afr_local { compound_args_t *c_args; gf_boolean_t is_read_txn; + afr_inode_ctx_t *inode_ctx; } afr_local_t; -typedef struct _afr_inode_ctx { - uint64_t read_subvol; - uint64_t write_subvol; - int spb_choice; - gf_timer_t *timer; - gf_boolean_t need_refresh; -} afr_inode_ctx_t; - typedef struct afr_spbc_timeout { call_frame_t *frame; gf_boolean_t d_spb; @@ -1274,4 +1277,7 @@ afr_write_subvol_set (call_frame_t *frame, xlator_t *this); int afr_write_subvol_reset (call_frame_t *frame, xlator_t *this); + +int +afr_set_inode_local (xlator_t *this, afr_local_t *local, inode_t *inode); #endif /* __AFR_H__ */ |