cluster/afr: Don't delay post op in cases of failures

Change-Id: Ib0c3af6babc61dc3ed45252582876e2f243d6446
BUG: 958118
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/5635
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
This commit is contained in:
Pranith Kumar K 2013-08-15 22:01:20 +05:30 committed by Anand Avati
parent 8fcf91b51c
commit faef08b7cf
3 changed files with 36 additions and 11 deletions

View File

@ -133,6 +133,7 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
struct iatt *postbuf, dict_t *xdata)
{
afr_local_t * local = NULL;
afr_private_t *priv = NULL;
call_frame_t *fop_frame = NULL;
int child_index = (long) cookie;
int call_count = -1;
@ -142,6 +143,7 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
uint32_t write_is_append = 0;
local = frame->local;
priv = this->private;
read_child = afr_inode_get_read_ctx (this, local->fd->inode, NULL);
@ -210,6 +212,10 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
afr_fd_report_unstable_write (this, local->fd);
afr_writev_handle_short_writes (frame, this);
if (afr_any_fops_failed (local, priv)) {
//Don't unwind until post-op is complete
local->transaction.resume (frame, this);
} else {
/*
* Generally inode-write fops do transaction.unwind then
* transaction.resume, but writev needs to make sure that
@ -221,10 +227,11 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
* completed.
*/
fop_frame = afr_transaction_detach_fop_frame (frame);
afr_writev_copy_outvars (frame, fop_frame);
local->transaction.resume (frame, this);
afr_writev_unwind (fop_frame, this);
fop_frame = afr_transaction_detach_fop_frame (frame);
afr_writev_copy_outvars (frame, fop_frame);
local->transaction.resume (frame, this);
afr_writev_unwind (fop_frame, this);
}
}
return 0;
}

View File

@ -1337,11 +1337,22 @@ afr_are_multiple_fds_opened (inode_t *inode, xlator_t *this)
return _gf_false;
}
gf_boolean_t
afr_any_fops_failed (afr_local_t *local, afr_private_t *priv)
{
if (local->success_count != priv->child_count)
return _gf_true;
return _gf_false;
}
gf_boolean_t
is_afr_delayed_changelog_post_op_needed (call_frame_t *frame, xlator_t *this)
{
afr_local_t *local = NULL;
gf_boolean_t res = _gf_false;
afr_private_t *priv = NULL;
priv = this->private;
local = frame->local;
if (!local)
@ -1350,6 +1361,10 @@ is_afr_delayed_changelog_post_op_needed (call_frame_t *frame, xlator_t *this)
if (!local->delayed_post_op)
goto out;
//Mark pending changelog ASAP
if (afr_any_fops_failed (local, priv))
goto out;
if (local->fd && afr_are_multiple_fds_opened (local->fd->inode, this))
goto out;
@ -1622,9 +1637,9 @@ afr_changelog_post_op_safe (call_frame_t *frame, xlator_t *this)
}
void
void
afr_delayed_changelog_post_op (xlator_t *this, call_frame_t *frame, fd_t *fd,
call_stub_t *stub)
call_stub_t *stub)
{
afr_fd_ctx_t *fd_ctx = NULL;
call_frame_t *prev_frame = NULL;
@ -1669,7 +1684,7 @@ out:
}
void
void
afr_changelog_post_op (call_frame_t *frame, xlator_t *this)
{
afr_local_t *local = NULL;
@ -1691,14 +1706,14 @@ afr_changelog_post_op (call_frame_t *frame, xlator_t *this)
The @stub gets saved in @local and gets resumed in
afr_local_cleanup()
*/
void
void
afr_delayed_changelog_wake_resume (xlator_t *this, fd_t *fd, call_stub_t *stub)
{
afr_delayed_changelog_post_op (this, NULL, fd, stub);
}
void
void
afr_delayed_changelog_wake_up (xlator_t *this, fd_t *fd)
{
afr_delayed_changelog_post_op (this, NULL, fd, NULL);
@ -1748,8 +1763,9 @@ afr_transaction_resume (call_frame_t *frame, xlator_t *this)
* afr_transaction_fop_failed - inform that an fop failed
*/
void
afr_transaction_fop_failed (call_frame_t *frame, xlator_t *this, int child_index)
void
afr_transaction_fop_failed (call_frame_t *frame, xlator_t *this,
int child_index)
{
afr_local_t * local = NULL;
afr_private_t * priv = NULL;

View File

@ -43,4 +43,6 @@ afr_delayed_changelog_wake_up (xlator_t *this, fd_t *fd);
void
__mark_all_success (int32_t *pending[], int child_count,
afr_transaction_type type);
gf_boolean_t
afr_any_fops_failed (afr_local_t *local, afr_private_t *priv);
#endif /* __TRANSACTION_H__ */