From b249ff7505392ae5cac1421a6a44310800d26feb Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Mon, 22 Aug 2011 11:59:11 +0530 Subject: cluster/afr: Paused fop should not continue with fop Change-Id: Idce22a6266c354e327d5d717715d2e62533eec58 BUG: 3448 Reviewed-on: http://review.gluster.com/292 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/cluster/afr/src/afr-inode-write.c | 6 +++--- xlators/cluster/afr/src/afr-open.c | 7 +++++++ xlators/cluster/afr/src/afr.h | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index 5d10944b1fd..b40af1b069f 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -355,7 +355,6 @@ afr_open_fd_fix (call_frame_t *frame, xlator_t *this, gf_boolean_t pause_fop) afr_local_t *local = NULL; afr_private_t *priv = NULL; gf_boolean_t fop_continue = _gf_true; - gf_boolean_t queue_fop = _gf_false; local = frame->local; priv = this->private; @@ -384,6 +383,7 @@ afr_open_fd_fix (call_frame_t *frame, xlator_t *this, gf_boolean_t pause_fop) fd_ctx->up_count = priv->up_count; fd_ctx->down_count = priv->down_count; } + for (i = 0; i < priv->child_count; i++) { if ((fd_ctx->opened_on[i] == AFR_FD_NOT_OPENED) && local->child_up[i]) { @@ -396,11 +396,11 @@ afr_open_fd_fix (call_frame_t *frame, xlator_t *this, gf_boolean_t pause_fop) need_open_count++; } else if (pause_fop && local->child_up[i] && (fd_ctx->opened_on[i] == AFR_FD_OPENING)) { - queue_fop = _gf_true; + local->fop_paused = _gf_true; } } - if (queue_fop) { + if (local->fop_paused) { GF_ASSERT (pause_fop); gf_log (this->name, GF_LOG_INFO, "Pause fd %p", local->fd); diff --git a/xlators/cluster/afr/src/afr-open.c b/xlators/cluster/afr/src/afr-open.c index ee037e5dfbb..ae585186064 100644 --- a/xlators/cluster/afr/src/afr-open.c +++ b/xlators/cluster/afr/src/afr-open.c @@ -263,6 +263,7 @@ afr_openfd_fix_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int call_count = 0; int child_index = (long) cookie; struct list_head paused_calls = {0}; + gf_boolean_t fop_paused = _gf_false; priv = this->private; local = frame->local; @@ -277,6 +278,7 @@ afr_openfd_fix_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto out; } + fop_paused = local->fop_paused; LOCK (&local->fd->lock); { if (op_ret >= 0) { @@ -297,12 +299,17 @@ afr_openfd_fix_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, out: if (call_count == 0) { afr_resume_calls (this, &paused_calls); + //If the fop is paused then resume_calls will continue the fop + if (fop_paused) + goto done; + if (local->fop_call_continue) local->fop_call_continue (frame, this); else AFR_STACK_DESTROY (frame); } +done: return 0; } diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index a392dbefa97..06e1a664e23 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -386,6 +386,7 @@ typedef struct _afr_local { dict_t *dict; int optimistic_change_log; + gf_boolean_t fop_paused; int (*fop_call_continue) (call_frame_t *frame, xlator_t *this); /* -- cgit