diff options
author | Shehjar Tikoo <shehjart@gluster.com> | 2010-05-07 01:53:11 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2010-05-08 06:37:42 -0700 |
commit | 45a2f82f659bf0af9e4bde403dad887f29d41e65 (patch) | |
tree | 17ed709a07a31e877579a970f5a806ae25f11917 /xlators/nfs/server/src/nfs3-helpers.c | |
parent | 79f8c310dfa52c035e41e46daa25ccf0419bea27 (diff) |
nfs3: Submit multiple vectors received in read callback
There is a possibility of io-cache or read-ahead returning
a read buffer that straddles two separate pages in ioc or ra,
through two struct iovecs. Current nfs3 read reply does not
return as many vectors as received from a subvolume leading to
a short read for the NFS client.
Signed-off-by: Shehjar Tikoo <shehjart@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 902 (iozone hangs during random read throughput test)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=902
Diffstat (limited to 'xlators/nfs/server/src/nfs3-helpers.c')
-rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c index f16bcac6f32..0d0007745f3 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -1529,7 +1529,8 @@ nfs3_fill_read3res (read3res *res, nfsstat3 stat, count3 count, res->read3res_u.resok.file_attributes = poa; res->read3res_u.resok.count = count; res->read3res_u.resok.eof = is_eof; - res->read3res_u.resok.data.data_len = count; + res->read3res_u.resok.data.data_len = xdr_length_round_up (count, + 1048576); } @@ -2205,13 +2206,18 @@ nfs3_log_readlink_res (uint32_t xid, nfsstat3 stat, int pstat, char *linkpath) void nfs3_log_read_res (uint32_t xid, nfsstat3 stat, int pstat, count3 count, - int is_eof) + int is_eof, struct iovec *vec, int32_t veccount) { char errstr[1024]; nfs3_stat_to_errstr (xid, "READ", stat, pstat, errstr); - gf_log (GF_NFS3, GF_LOG_DEBUG, "%s, count: %"PRIu32", is_eof: %d", - errstr, count, is_eof); + if (vec) + gf_log (GF_NFS3, GF_LOG_DEBUG, "%s, count: %"PRIu32", is_eof:" + " %d, vector: count: %d, len: %"PRIu64, errstr, count, + is_eof, veccount, vec->iov_len); + else + gf_log (GF_NFS3, GF_LOG_DEBUG, "%s, count: %"PRIu32", is_eof:" + " %d", errstr, count, is_eof); } |