diff options
author | Raghavendra G <raghavendra@gluster.com> | 2009-09-22 23:49:55 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-09-23 01:47:20 -0700 |
commit | 8b76f7c394e99f35463fc508984c6c532ddf4a8f (patch) | |
tree | f154f94ac6df6708a97186f85244551ae14b24bb /xlators/performance/write-behind | |
parent | 248c6f76d5bee281d7f78e135591d8c3ab964b6b (diff) |
performance/write-behind: reduce usage of iov_length.
- request structure now holds a member write_size which is initialised at the
time of request creation and used later.
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 276 (write behind needs to be optimized.)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=276
Diffstat (limited to 'xlators/performance/write-behind')
-rw-r--r-- | xlators/performance/write-behind/src/write-behind.c | 74 |
1 files changed, 27 insertions, 47 deletions
diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c index a3c042e48..6ba5fafa2 100644 --- a/xlators/performance/write-behind/src/write-behind.c +++ b/xlators/performance/write-behind/src/write-behind.c @@ -66,6 +66,7 @@ typedef struct wb_request { list_head_t unwinds; list_head_t other_requests; call_stub_t *stub; + size_t write_size; int32_t refcount; wb_file_t *file; union { @@ -224,7 +225,8 @@ wb_enqueue (wb_file_t *file, call_stub_t *stub) frame = stub->frame; local = frame->local; - local->op_ret = iov_length (vector, count); + request->write_size = iov_length (vector, count); + local->op_ret = request->write_size; local->op_errno = 0; } @@ -389,8 +391,7 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds) bytecount); copied += bytecount; - current_size += iov_length (request->stub->args.writev.vector, - request->stub->args.writev.count); + current_size += request->write_size; if (request->stub->args.writev.iobref) { iobref_merge (iobref, @@ -409,8 +410,7 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds) if ((!next) || ((count + next->stub->args.writev.count) > MAX_VECTOR_COUNT) - || ((current_size + iov_length (next->stub->args.writev.vector, - next->stub->args.writev.count)) + || ((current_size + next->write_size) > conf->aggregate_size)) { sync_frame = copy_frame (frame); @@ -1047,11 +1047,8 @@ __wb_mark_wind_all (list_head_t *list, list_head_t *winds) { wb_request_t *request = NULL; size_t size = 0; - struct iovec *vector = NULL; - int32_t count = 0; char first_request = 1; off_t offset_expected = 0; - size_t length = 0; list_for_each_entry (request, list, list) { @@ -1060,8 +1057,6 @@ __wb_mark_wind_all (list_head_t *list, list_head_t *winds) break; } - vector = request->stub->args.writev.vector; - count = request->stub->args.writev.count; if (!request->flags.write_request.stack_wound) { if (first_request) { first_request = 0; @@ -1072,9 +1067,8 @@ __wb_mark_wind_all (list_head_t *list, list_head_t *winds) break; } - length = iov_length (vector, count); - size += length; - offset_expected += length; + size += request->write_size; + offset_expected += request->write_size; request->flags.write_request.stack_wound = 1; list_add_tail (&request->winds, winds); @@ -1091,9 +1085,7 @@ __wb_can_wind (list_head_t *list, size_t aggregate_conf, char *incomplete_writes, char *enough_data_aggregated) { wb_request_t *request = NULL; - size_t aggregate_current = 0, length = 0; - struct iovec *vector = NULL; - int32_t count = 0; + size_t aggregate_current = 0; char first_request = 1; off_t offset_expected = 0; @@ -1114,8 +1106,6 @@ __wb_can_wind (list_head_t *list, size_t aggregate_conf, break; } - vector = request->stub->args.writev.vector; - count = request->stub->args.writev.count; if (!request->flags.write_request.stack_wound) { if (first_request) { first_request = 0; @@ -1129,9 +1119,8 @@ __wb_can_wind (list_head_t *list, size_t aggregate_conf, break; } - length = iov_length (vector, count); - aggregate_current += length; - offset_expected += length; + aggregate_current += request->write_size; + offset_expected += request->write_size; if (aggregate_current >= aggregate_conf) { if (enough_data_aggregated != NULL) { @@ -1182,8 +1171,6 @@ __wb_can_unwind (list_head_t *list, size_t window_conf, { wb_request_t *request = NULL; size_t window_current = 0; - struct iovec *vector = NULL; - int32_t count = 0; char can_unwind = 1; list_for_each_entry (request, list, list) @@ -1193,13 +1180,10 @@ __wb_can_unwind (list_head_t *list, size_t window_conf, continue; } - vector = request->stub->args.writev.vector; - count = request->stub->args.writev.count; - if (request->flags.write_request.write_behind && !request->flags.write_request.got_reply) { - window_current += iov_length (vector, count); + window_current += request->write_size; if (window_current > window_conf) { can_unwind = 0; break; @@ -1220,8 +1204,6 @@ __wb_mark_unwind_till (list_head_t *list, list_head_t *unwinds, size_t size) { size_t written_behind = 0; wb_request_t *request = NULL; - struct iovec *vector = NULL; - int32_t count = 0; list_for_each_entry (request, list, list) { @@ -1230,12 +1212,9 @@ __wb_mark_unwind_till (list_head_t *list, list_head_t *unwinds, size_t size) continue; } - vector = request->stub->args.writev.vector; - count = request->stub->args.writev.count; - if (written_behind <= size) { if (!request->flags.write_request.write_behind) { - written_behind += iov_length (vector, count); + written_behind += request->write_size; request->flags.write_request.write_behind = 1; list_add_tail (&request->unwinds, unwinds); } @@ -1368,7 +1347,7 @@ __wb_collapse_write_bufs (list_head_t *requests, size_t page_size) { off_t offset_expected = 0; - size_t space_left = 0, length = 0, *iov_len = NULL; + size_t space_left = 0, *iov_len = NULL, *write_size = NULL; char *ptr = NULL, first_request = 1; wb_request_t *request = NULL, *tmp = NULL; @@ -1382,46 +1361,47 @@ __wb_collapse_write_bufs (list_head_t *requests, size_t page_size) } if (request->flags.write_request.write_behind) { - length = iov_length (request->stub->args.writev.vector, - request->stub->args.writev.count); - if (first_request) { first_request = 0; offset_expected = request->stub->args.writev.off; } if (request->stub->args.writev.off != offset_expected) { - offset_expected = request->stub->args.writev.off + length; - space_left = page_size - length; + offset_expected = request->stub->args.writev.off + + request->write_size; + space_left = page_size - request->write_size; ptr = request->stub->args.writev.vector[0].iov_base - + length; + + request->write_size; iov_len = &request->stub->args.writev.vector[0].iov_len; + write_size = &request->write_size; continue; } - if (space_left >= length) { + if (space_left >= request->write_size) { iov_unload (ptr, request->stub->args.writev.vector, request->stub->args.writev.count); - space_left -= length; - ptr += length; - *iov_len = *iov_len + length; + space_left -= request->write_size; + ptr += request->write_size; + *iov_len = *iov_len + request->write_size; + *write_size = *write_size + request->write_size; list_move_tail (&request->list, &request->file->passive_requests); __wb_request_unref (request); } else { - space_left = page_size - length; + space_left = page_size - request->write_size; ptr = request->stub->args.writev.vector[0].iov_base - + length; + + request->write_size; iov_len = &request->stub->args.writev.vector[0].iov_len; + write_size = &request->write_size; } } else { break; } - offset_expected += length; + offset_expected += request->write_size; } } |