diff options
| author | Anuradha Talur <atalur@redhat.com> | 2016-08-25 11:46:25 +0530 | 
|---|---|---|
| committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2016-09-01 10:22:39 -0700 | 
| commit | befae0b48729894282b5b8b174907e24779c3442 (patch) | |
| tree | 1f43412cb788a40ddc547e15fe71e16f39fd1442 /xlators/cluster/afr/src/afr-inode-write.c | |
| parent | 68b23745602e4cc6317d6dce72ed0392d4174972 (diff) | |
afr: Consume compound fops in afr transaction
Change-Id: Ib06ece3cce1b10d28d6d2953da28444f5c2457ad
BUG: 1290304
Signed-off-by: Anuradha Talur <atalur@redhat.com>
Reviewed-on: http://review.gluster.org/15014
Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-inode-write.c')
| -rw-r--r-- | xlators/cluster/afr/src/afr-inode-write.c | 73 | 
1 files changed, 48 insertions, 25 deletions
diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index 24ab52f0266..200b420f5f0 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -292,21 +292,16 @@ afr_writev_handle_short_writes (call_frame_t *frame, xlator_t *this)          }  } -int -afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +void +afr_inode_write_fill (call_frame_t *frame, xlator_t *this, int child_index,                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf,                       struct iatt *postbuf, dict_t *xdata)  { -        afr_local_t *   local = NULL; -        call_frame_t    *fop_frame = NULL; -        int child_index = (long) cookie; -        int call_count  = -1;          int ret = 0; +        afr_local_t *local = frame->local;          uint32_t open_fd_count = 0;          uint32_t write_is_append = 0; -        local = frame->local; -          LOCK (&frame->lock);          {                  __afr_inode_write_fill (frame, this, child_index, op_ret, @@ -324,32 +319,60 @@ afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  				       &open_fd_count);  		if (ret == -1)  			goto unlock; -		if ((open_fd_count > local->open_fd_count)) { -			local->open_fd_count = open_fd_count; -			local->update_open_fd_count = _gf_true; +		if (open_fd_count > local->open_fd_count) { +                        local->open_fd_count = open_fd_count; +                        local->update_open_fd_count = _gf_true;  		}          }  unlock:          UNLOCK (&frame->lock); +} -        call_count = afr_frame_return (frame); +void +afr_process_post_writev (call_frame_t *frame, xlator_t *this) +{ +        afr_local_t     *local = NULL; -        if (call_count == 0) { -		if (!local->stable_write && !local->append_write) -			/* An appended write removes the necessity to -			   fsync() the file. This is because self-heal -			   has the logic to check for larger file when -			   the xattrs are not reliably pointing at -			   a stale file. -			*/ -			afr_fd_report_unstable_write (this, local->fd); +        local = frame->local; -		__afr_inode_write_finalize (frame, this); +        if (!local->stable_write && !local->append_write) +                /* An appended write removes the necessity to +                   fsync() the file. This is because self-heal +                   has the logic to check for larger file when +                   the xattrs are not reliably pointing at +                   a stale file. +                */ +                afr_fd_report_unstable_write (this, local->fd); + +        __afr_inode_write_finalize (frame, this); -                afr_writev_handle_short_writes (frame, this); +        afr_writev_handle_short_writes (frame, this); -                if (local->update_open_fd_count) -                        afr_handle_open_fd_count (frame, this); +        if (local->update_open_fd_count) +                afr_handle_open_fd_count (frame, this); + +} + +int +afr_writev_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +                     int32_t op_ret, int32_t op_errno, struct iatt *prebuf, +                     struct iatt *postbuf, dict_t *xdata) +{ +        afr_local_t     *local = NULL; +        call_frame_t    *fop_frame = NULL; +        int child_index = (long) cookie; +        int call_count  = -1; +        int ret = 0; + +        local = frame->local; + +        afr_inode_write_fill (frame, this, child_index, op_ret, op_errno, +                              prebuf, postbuf, xdata); + +        call_count = afr_frame_return (frame); + +        if (call_count == 0) { +                afr_process_post_writev (frame, this);                  if (!afr_txn_nothing_failed (frame, this)) {                          //Don't unwind until post-op is complete  | 
