diff options
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-algorithm.c | 15 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 22 |
2 files changed, 30 insertions, 7 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-algorithm.c b/xlators/cluster/afr/src/afr-self-heal-algorithm.c index 1c7cdf41819..63889c8452b 100644 --- a/xlators/cluster/afr/src/afr-self-heal-algorithm.c +++ b/xlators/cluster/afr/src/afr-self-heal-algorithm.c @@ -92,7 +92,7 @@ sh_number_of_writes_needed (unsigned char *write_needed, int child_count) static int -sh_loop_driver_done (call_frame_t *frame, xlator_t *this, +sh_loop_driver_done (call_frame_t *sh_frame, xlator_t *this, call_frame_t *last_loop_frame) { afr_private_t *priv = NULL; @@ -103,13 +103,13 @@ sh_loop_driver_done (call_frame_t *frame, xlator_t *this, int32_t diff_blocks = 0; priv = this->private; - local = frame->local; + local = sh_frame->local; sh = &local->self_heal; sh_priv = sh->private; total_blocks = sh_priv->total_blocks; diff_blocks = sh_priv->diff_blocks; - sh_private_cleanup (frame, this); + sh_private_cleanup (sh_frame, this); if (sh->op_failed) { GF_ASSERT (!last_loop_frame); //loop_finish should have happened and the old_loop should be NULL @@ -117,7 +117,7 @@ sh_loop_driver_done (call_frame_t *frame, xlator_t *this, "self-heal aborting on %s", local->loc.path); - local->self_heal.algo_abort_cbk (frame, this); + local->self_heal.algo_abort_cbk (sh_frame, this); } else { GF_ASSERT (last_loop_frame); if (diff_blocks == total_blocks) { @@ -131,8 +131,11 @@ sh_loop_driver_done (call_frame_t *frame, xlator_t *this, ((diff_blocks * 1.0)/total_blocks) * 100); } - sh->old_loop_frame = last_loop_frame; - local->self_heal.algo_completion_cbk (frame, this); + if (sh_frame == last_loop_frame) + sh->old_loop_frame = NULL; + else + sh->old_loop_frame = last_loop_frame; + local->self_heal.algo_completion_cbk (sh_frame, this); } return 0; diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index 60f42c54b14..009ac705be3 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -63,6 +63,15 @@ int afr_sh_data_finish (call_frame_t *frame, xlator_t *this); int +afr_sh_data_fxattrop (call_frame_t *frame, xlator_t *this, + afr_fxattrop_cbk_t fxattrop_cbk); + +int +afr_post_sh_data_fxattrop_cbk (call_frame_t *frame, void *cookie, + xlator_t *this, int32_t op_ret, int32_t op_errno, + dict_t *xattr); + +int afr_sh_data_done (call_frame_t *frame, xlator_t *this) { afr_local_t *local = NULL; @@ -353,15 +362,26 @@ afr_sh_data_erase_pending_cbk (call_frame_t *frame, void *cookie, int32_t op_errno, dict_t *xattr) { int call_count = 0; + afr_local_t *local = NULL; + afr_self_heal_t *sh = NULL; call_count = afr_frame_return (frame); if (call_count == 0) { + local = frame->local; + sh = &local->self_heal; + if (NULL == sh->old_loop_frame) { + GF_ASSERT (sh->data_lock_held); + afr_sh_data_fxattrop (frame, this, + afr_post_sh_data_fxattrop_cbk); + goto out; + } + afr_sh_data_lock (frame, this, 0, 0, afr_post_sh_big_lock_success, afr_post_sh_big_lock_failure); } - +out: return 0; } |