From c93e436527e9d2ceed46b939e18edc40b7018cee Mon Sep 17 00:00:00 2001 From: Krutika Dhananjay Date: Mon, 23 Nov 2015 13:06:25 +0530 Subject: features/shard: Eliminate extra update to postbuf in writev After an extending write is complete, shard translator updates postbuf at two places: 1. shard_update_file_size_cbk(), and 2. shard_post_update_size_writev_handler(). This can lead to unexpected behavior if md-cache is part of the client stack and caches and serves values returned by shard translator in postbuf. This patch eliminates the update to postbuf in shard_post_update_size_writev_handler(). Change-Id: I9d107bf57baad66886eebec14aa369b6a3c88c49 BUG: 1284365 Signed-off-by: Krutika Dhananjay Reviewed-on: http://review.gluster.org/12717 Tested-by: NetBSD Build System Tested-by: Gluster Build System Reviewed-by: Pranith Kumar Karampuri --- xlators/features/shard/src/shard.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'xlators/features/shard') diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c index 35c9d1d9d45..ed02f6a8c60 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -3360,14 +3360,11 @@ shard_post_update_size_writev_handler (call_frame_t *frame, xlator_t *this) if (local->op_ret < 0) { SHARD_STACK_UNWIND (writev, frame, local->op_ret, local->op_errno, NULL, NULL, NULL); - return 0; + } else { + SHARD_STACK_UNWIND (writev, frame, local->written_size, + local->op_errno, &local->prebuf, + &local->postbuf, local->xattr_rsp); } - - local->postbuf.ia_size += (local->delta_size + local->hole_size); - local->postbuf.ia_blocks += local->delta_blocks; - - SHARD_STACK_UNWIND (writev, frame, local->written_size, local->op_errno, - &local->prebuf, &local->postbuf, local->xattr_rsp); return 0; } @@ -3423,16 +3420,20 @@ shard_writev_do_cbk (call_frame_t *frame, void *cookie, xlator_t *this, local = frame->local; - if (op_ret < 0) { - local->op_ret = op_ret; - local->op_errno = op_errno; - } else { - local->written_size += op_ret; - local->delta_blocks += (postbuf->ia_blocks - prebuf->ia_blocks); - local->delta_size += (postbuf->ia_size - prebuf->ia_size); - shard_inode_ctx_set (local->fd->inode, this, postbuf, 0, - SHARD_MASK_TIMES); + LOCK (&frame->lock); + { + if (op_ret < 0) { + local->op_ret = op_ret; + local->op_errno = op_errno; + } else { + local->written_size += op_ret; + local->delta_blocks += (postbuf->ia_blocks - prebuf->ia_blocks); + local->delta_size += (postbuf->ia_size - prebuf->ia_size); + shard_inode_ctx_set (local->fd->inode, this, postbuf, 0, + SHARD_MASK_TIMES); + } } + UNLOCK (&frame->lock); if (anon_fd) fd_unref (anon_fd); -- cgit