diff options
author | Raghavendra G <raghavendra@gluster.com> | 2009-09-22 01:38:37 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-09-22 06:13:21 -0700 |
commit | 35d1cabfd1266609ec22f11e5e4ddba13f0ffc56 (patch) | |
tree | 611b2df4c5abd0f78e836ab4d0525f435d8f2dc2 /xlators | |
parent | db33e097111ca76f487f087d494984d45d4b3b64 (diff) |
performance/write-behind: reduce traversal of request list during wb_mark_winds.
- move all the decision making code to __wb_can_wind.
- don't continue traversing the request list, once we know any of the
following conditions are true:
* requests other than write are present in queue.
* writes are happening at non-contiguous offsets.
* there are no write requests, which are wound to server but not yet
received the reply.
* enough data is aggregated for writing.
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')
-rw-r--r-- | xlators/performance/write-behind/src/write-behind.c | 63 |
1 files changed, 28 insertions, 35 deletions
diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c index f4a3fe89c9c..1006b730a9c 100644 --- a/xlators/performance/write-behind/src/write-behind.c +++ b/xlators/performance/write-behind/src/write-behind.c @@ -1316,12 +1316,13 @@ __wb_mark_wind_all (list_head_t *list, list_head_t *winds) } -size_t -__wb_get_aggregate_size (list_head_t *list, char *other_fop_in_queue, - char *non_contiguous_writes) +void +__wb_can_wind (list_head_t *list, size_t aggregate_conf, + char *other_fop_in_queue, char *non_contiguous_writes, + char *incomplete_writes, char *enough_data_aggregated) { wb_request_t *request = NULL; - size_t size = 0, length = 0; + size_t aggregate_current = 0, length = 0; struct iovec *vector = NULL; int32_t count = 0; char first_request = 1; @@ -1337,6 +1338,13 @@ __wb_get_aggregate_size (list_head_t *list, char *other_fop_in_queue, break; } + if (request->flags.write_request.stack_wound + && !request->flags.write_request.got_reply + && (incomplete_writes != NULL)) { + *incomplete_writes = 1; + break; + } + vector = request->stub->args.writev.vector; count = request->stub->args.writev.count; if (!request->flags.write_request.stack_wound) { @@ -1353,36 +1361,19 @@ __wb_get_aggregate_size (list_head_t *list, char *other_fop_in_queue, } length = iov_length (vector, count); - size += length; + aggregate_current += length; offset_expected += length; - } - } - - return size; -} - - -char -__wb_any_incomplete_writes (list_head_t *list) -{ - wb_request_t *request = NULL; - char incomplete_writes = 0; - - list_for_each_entry (request, list, list) - { - if ((request->stub == NULL) - || (request->stub->fop != GF_FOP_WRITE)) { - break; - } - if (request->flags.write_request.stack_wound - && !request->flags.write_request.got_reply) { - incomplete_writes = 1; - break; + if (aggregate_current >= aggregate_conf) { + if (enough_data_aggregated != NULL) { + *enough_data_aggregated = 1; + } + break; + } } } - return incomplete_writes; + return; } @@ -1390,18 +1381,20 @@ ssize_t __wb_mark_winds (list_head_t *list, list_head_t *winds, size_t aggregate_conf, char wind_all) { - size_t aggregate_current = 0, size = 0; + size_t size = 0; char incomplete_writes = 0; char other_fop_in_queue = 0; char non_contiguous_writes = 0; + char enough_data_aggregated = 0; - incomplete_writes = __wb_any_incomplete_writes (list); - - aggregate_current = __wb_get_aggregate_size (list, &other_fop_in_queue, - &non_contiguous_writes); + if (!wind_all) { + __wb_can_wind (list, aggregate_conf, &other_fop_in_queue, + &non_contiguous_writes, &incomplete_writes, + &enough_data_aggregated); + } if ((!incomplete_writes) || (wind_all) || (non_contiguous_writes) - || (other_fop_in_queue) || (aggregate_current >= aggregate_conf)) { + || (other_fop_in_queue) || (enough_data_aggregated)) { size = __wb_mark_wind_all (list, winds); } |