diff options
| -rw-r--r-- | tests/bugs/bug-765564.t | 11 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-lk-common.c | 31 | 
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,  | 
