summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/bugs/bug-765564.t11
-rw-r--r--xlators/cluster/afr/src/afr-lk-common.c31
2 files changed, 27 insertions, 15 deletions
diff --git a/tests/bugs/bug-765564.t b/tests/bugs/bug-765564.t
index d82f8ca37ac..0b8b8cd4f9e 100644
--- a/tests/bugs/bug-765564.t
+++ b/tests/bugs/bug-765564.t
@@ -1,6 +1,7 @@
#!/bin/bash
. $(dirname $0)/../include.rc
+. $(dirname $0)/../volume.rc
TEST glusterd
TEST pidof glusterd
@@ -66,6 +67,16 @@ function rm_mv_correctness () {
TEST touch $M0/a;
TEST mv $M0/a $M0/b;
+#test rename fop when one of the bricks is down
+kill_brick ${V0} ${H0} ${B0}/${V0}-1;
+TEST touch $M0/h;
+TEST mv $M0/h $M0/1;
+
+TEST $CLI volume start $V0 force;
+
+EXPECT_WITHIN 20 "1" afr_child_up_status $V0 1;
+find $M0 | xargs stat 2>/dev/null 1>/dev/null;
+
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 265330d115b..542b2959d83 100644
--- a/xlators/cluster/afr/src/afr-lk-common.c
+++ b/xlators/cluster/afr/src/afr-lk-common.c
@@ -1019,6 +1019,17 @@ afr_is_entrylk (afr_internal_lock_t *int_lock,
return is_entrylk;
}
+static gf_boolean_t
+_is_lock_wind_needed (afr_local_t *local, int child_index)
+{
+ if (!local->child_up[child_index])
+ return _gf_false;
+ else if (local->fd && !local->fd_open_on[child_index])
+ return _gf_false;
+
+ return _gf_true;
+}
+
int
afr_lock_blocking (call_frame_t *frame, xlator_t *this, int cookie)
{
@@ -1059,20 +1070,6 @@ afr_lock_blocking (call_frame_t *frame, xlator_t *this, int cookie)
return 0;
}
-
- /* skip over children that or down
- or don't have the fd open */
-
- while ((child_index < priv->child_count)
- && (!local->child_up[child_index] ||
- !local->fd_open_on[child_index]))
-
- child_index++;
- } else {
- /* skip over children that are down */
- while ((child_index < priv->child_count)
- && !local->child_up[child_index])
- child_index++;
}
if (int_lock->lk_expected_count == int_lock->lk_attempted_count) {
@@ -1107,6 +1104,11 @@ afr_lock_blocking (call_frame_t *frame, xlator_t *this, int cookie)
return 0;
}
+ if (!_is_lock_wind_needed (local, child_index)) {
+ afr_lock_blocking (frame, this, cookie + 1);
+ return 0;
+ }
+
switch (local->transaction.type) {
case AFR_DATA_TRANSACTION:
case AFR_METADATA_TRANSACTION:
@@ -1144,7 +1146,6 @@ afr_lock_blocking (call_frame_t *frame, xlator_t *this, int cookie)
case AFR_ENTRY_TRANSACTION:
/*Accounting for child_index increments on 'down'
*and 'fd-less' children */
- cookie = lockee_no * priv->child_count + child_index;
if (local->fd) {
AFR_TRACE_ENTRYLK_IN (frame, this, AFR_ENTRYLK_TRANSACTION,