From ba149bac92d169ae2256dbc75202dc9e5d06538e Mon Sep 17 00:00:00 2001 From: karthik-us Date: Mon, 18 Dec 2017 16:46:39 +0530 Subject: 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 --- xlators/cluster/afr/src/afr-dir-write.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'xlators/cluster/afr/src/afr-dir-write.c') diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c index 1afd5d39670..92876930e73 100644 --- a/xlators/cluster/afr/src/afr-dir-write.c +++ b/xlators/cluster/afr/src/afr-dir-write.c @@ -476,7 +476,7 @@ afr_create (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, if (!local->fd_ctx) goto out; - local->inode = inode_ref (loc->inode); + local->inode = inode_ref (loc->inode); local->parent = inode_ref (loc->parent); local->op = GF_FOP_CREATE; @@ -608,7 +608,7 @@ afr_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, goto out; loc_copy (&local->loc, loc); - local->inode = inode_ref (loc->inode); + local->inode = inode_ref (loc->inode); local->parent = inode_ref (loc->parent); local->op = GF_FOP_MKNOD; @@ -739,7 +739,7 @@ afr_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, goto out; loc_copy (&local->loc, loc); - local->inode = inode_ref (loc->inode); + local->inode = inode_ref (loc->inode); local->parent = inode_ref (loc->parent); local->cont.mkdir.mode = mode; @@ -876,7 +876,7 @@ afr_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, loc_copy (&local->loc, oldloc); loc_copy (&local->newloc, newloc); - local->inode = inode_ref (oldloc->inode); + local->inode = inode_ref (oldloc->inode); local->parent = inode_ref (newloc->parent); if (xdata) @@ -1004,7 +1004,7 @@ afr_symlink (call_frame_t *frame, xlator_t *this, const char *linkpath, goto out; loc_copy (&local->loc, loc); - local->inode = inode_ref (loc->inode); + local->inode = inode_ref (loc->inode); local->parent = inode_ref (loc->parent); local->cont.symlink.linkpath = gf_strdup (linkpath); @@ -1141,7 +1141,7 @@ afr_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, loc_copy (&local->loc, oldloc); loc_copy (&local->newloc, newloc); - local->inode = inode_ref (oldloc->inode); + local->inode = inode_ref (oldloc->inode); local->parent = inode_ref (oldloc->parent); local->parent2 = inode_ref (newloc->parent); @@ -1294,7 +1294,7 @@ afr_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag, loc_copy (&local->loc, loc); local->xflag = xflag; - local->inode = inode_ref (loc->inode); + local->inode = inode_ref (loc->inode); local->parent = inode_ref (loc->parent); if (xdata) @@ -1420,7 +1420,7 @@ afr_rmdir (call_frame_t *frame, xlator_t *this, loc_t *loc, int flags, loc_copy (&local->loc, loc); - local->inode = inode_ref (loc->inode); + local->inode = inode_ref (loc->inode); local->parent = inode_ref (loc->parent); local->cont.rmdir.flags = flags; -- cgit