summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2016-03-29 18:36:08 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2016-04-16 22:43:47 -0700
commitbd8ab0567017fd4dddfea738eae0bccc40b85527 (patch)
tree87fdd50fdb0b8aa1e34e08f9690fe11a79819f4c
parent02a235b5a5fcfffd17debfbf3fceeddffe171682 (diff)
features/shard: Make o-direct writes work with sharding
Backport of: http://review.gluster.org/#/c/13846/ With files opened with o-direct, the expectation is that the IO performed on the fds is byte aligned wrt the sector size of the underlying device. With files getting sharded, a single write from the application could be broken into more than one write falling on different shards which _might_ cause the original byte alignment property to be lost. To get around this, shard translator will send fsync on odirect writes to emulate o-direct-like behavior in the backend. Change-Id: I992e10162afcca17a19d9cba3bcb187a31c618ae BUG: 1325843 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: http://review.gluster.org/13966 Smoke: Gluster Build System <jenkins@build.gluster.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
-rw-r--r--xlators/features/shard/src/shard.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
index c7a57e08645..78bb82d923e 100644
--- a/xlators/features/shard/src/shard.c
+++ b/xlators/features/shard/src/shard.c
@@ -3591,6 +3591,7 @@ shard_common_inode_write_do (call_frame_t *frame, xlator_t *this)
shard_local_t *local = NULL;
struct iovec *vec = NULL;
gf_boolean_t wind_failed = _gf_false;
+ gf_boolean_t odirect = _gf_false;
off_t orig_offset = 0;
off_t shard_offset = 0;
off_t vec_offset = 0;
@@ -3621,6 +3622,9 @@ shard_common_inode_write_do (call_frame_t *frame, xlator_t *this)
return 0;
}
+ if ((fd->flags & O_DIRECT) && (local->fop == GF_FOP_WRITE))
+ odirect = _gf_true;
+
while (cur_block <= last_block) {
if (wind_failed) {
shard_common_inode_write_do_cbk (frame,
@@ -3678,6 +3682,8 @@ shard_common_inode_write_do (call_frame_t *frame, xlator_t *this)
NULL, NULL);
goto next;
}
+ if (odirect)
+ local->flags |= O_SYNC;
}
shard_common_inode_write_wind (frame, this, anon_fd,