From 99e63168c498cf57f3f8fabab1d2b86a4ea639ce Mon Sep 17 00:00:00 2001 From: Raghavendra Bhat Date: Mon, 28 Jan 2013 12:55:17 +0530 Subject: cluster/afr: before checking lock_count of internal lock make sure its not entrylk when the expected lock count is equal to the attempted lock count, then before deciding that lock is failed on all the nodes, make sure the lock type is checked properly. Change-Id: I1f362d54320cb6ec5654c5c69915c0f61c91d8c7 BUG: 765564 Signed-off-by: Raghavendra Bhat Reviewed-on: http://review.gluster.org/4436 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- tests/bugs/bug-765564.t | 3 +++ xlators/cluster/afr/src/afr-lk-common.c | 25 +++++++++++++------------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/tests/bugs/bug-765564.t b/tests/bugs/bug-765564.t index cf00f520..c1f29d92 100644 --- a/tests/bugs/bug-765564.t +++ b/tests/bugs/bug-765564.t @@ -63,6 +63,9 @@ function rm_mv_correctness () { return $ret } +TEST touch a; +TEST mv a b; + TEST rm_mv_correctness; TEST umount $M0; cleanup; diff --git a/xlators/cluster/afr/src/afr-lk-common.c b/xlators/cluster/afr/src/afr-lk-common.c index 802f91f5..265330d1 100644 --- a/xlators/cluster/afr/src/afr-lk-common.c +++ b/xlators/cluster/afr/src/afr-lk-common.c @@ -1030,6 +1030,7 @@ afr_lock_blocking (call_frame_t *frame, xlator_t *this, int cookie) int ret = 0; int child_index = 0; int lockee_no = 0; + gf_boolean_t is_entrylk = _gf_false; local = frame->local; int_lock = &local->internal_lock; @@ -1074,23 +1075,23 @@ afr_lock_blocking (call_frame_t *frame, xlator_t *this, int cookie) child_index++; } - if ((int_lock->lk_expected_count == int_lock->lk_attempted_count) && - ((afr_is_entrylk (int_lock, local->transaction.type) && - int_lock->entrylk_lock_count == 0) || - (int_lock->lock_count == 0))){ - - gf_log (this->name, GF_LOG_INFO, - "unable to lock on even one child"); + if (int_lock->lk_expected_count == int_lock->lk_attempted_count) { + is_entrylk = afr_is_entrylk (int_lock, local->transaction.type); - local->op_ret = -1; - int_lock->lock_op_ret = -1; + if ((is_entrylk && int_lock->entrylk_lock_count == 0) || + (!is_entrylk && int_lock->lock_count == 0)) { + gf_log (this->name, GF_LOG_INFO, + "unable to lock on even one child"); - afr_copy_locked_nodes (frame, this); + local->op_ret = -1; + int_lock->lock_op_ret = -1; - afr_unlock(frame, this); + afr_copy_locked_nodes (frame, this); - return 0; + afr_unlock(frame, this); + return 0; + } } if (int_lock->lk_expected_count == int_lock->lk_attempted_count) { -- cgit