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:
parent
8fcf91b51c
commit
faef08b7cf
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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__ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user