summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/performance/write-behind/src/write-behind.c63
1 files changed, 41 insertions, 22 deletions
diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c
index 1006b730a..10e8ec4b1 100644
--- a/xlators/performance/write-behind/src/write-behind.c
+++ b/xlators/performance/write-behind/src/write-behind.c
@@ -88,6 +88,7 @@ struct wb_conf {
uint64_t disable_till;
gf_boolean_t enable_O_SYNC;
gf_boolean_t flush_behind;
+ gf_boolean_t enable_trickling_writes;
};
@@ -114,7 +115,7 @@ wb_sync (call_frame_t *frame, wb_file_t *file, list_head_t *winds);
ssize_t
__wb_mark_winds (list_head_t *list, list_head_t *winds, size_t aggregate_size,
- char wind_all);
+ char wind_all, char enable_trickling_writes);
static void
@@ -1379,17 +1380,22 @@ __wb_can_wind (list_head_t *list, size_t aggregate_conf,
ssize_t
__wb_mark_winds (list_head_t *list, list_head_t *winds, size_t aggregate_conf,
- char wind_all)
+ char wind_all, char enable_trickling_writes)
{
- size_t size = 0;
- char incomplete_writes = 0;
- char other_fop_in_queue = 0;
- char non_contiguous_writes = 0;
+ size_t size = 0;
+ char other_fop_in_queue = 0;
+ char incomplete_writes = 1;
+ char non_contiguous_writes = 0;
char enough_data_aggregated = 0;
+ char *trickling_writes = NULL;
+
+ if (enable_trickling_writes) {
+ trickling_writes = &incomplete_writes;
+ }
if (!wind_all) {
__wb_can_wind (list, aggregate_conf, &other_fop_in_queue,
- &non_contiguous_writes, &incomplete_writes,
+ &non_contiguous_writes, trickling_writes,
&enough_data_aggregated);
}
@@ -1700,7 +1706,8 @@ wb_process_queue (call_frame_t *frame, wb_file_t *file, char flush_all)
if (count == 0) {
__wb_mark_winds (&file->request, &winds, size,
- flush_all);
+ flush_all,
+ conf->enable_trickling_writes);
}
}
@@ -2278,10 +2285,7 @@ init (xlator_t *this)
{
dict_t *options = NULL;
wb_conf_t *conf = NULL;
- char *window_size_string = NULL;
- char *flush_behind_string = NULL;
- char *disable_till_string = NULL;
- char *enable_O_SYNC_string = NULL;
+ char *str = NULL;
int32_t ret = -1;
if ((this->children == NULL)
@@ -2309,9 +2313,9 @@ init (xlator_t *this)
conf->enable_O_SYNC = _gf_false;
ret = dict_get_str (options, "enable-O_SYNC",
- &enable_O_SYNC_string);
+ &str);
if (ret == 0) {
- ret = gf_string2boolean (enable_O_SYNC_string,
+ ret = gf_string2boolean (str,
&conf->enable_O_SYNC);
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
@@ -2324,15 +2328,15 @@ init (xlator_t *this)
conf->aggregate_size = WB_AGGREGATE_SIZE;
conf->disable_till = 1;
ret = dict_get_str (options, "disable-for-first-nbytes",
- &disable_till_string);
+ &str);
if (ret == 0) {
- ret = gf_string2bytesize (disable_till_string,
+ ret = gf_string2bytesize (str,
&conf->disable_till);
if (ret != 0) {
gf_log (this->name, GF_LOG_ERROR,
"invalid number format \"%s\" of \"option "
"disable-for-first-nbytes\"",
- disable_till_string);
+ str);
return -1;
}
}
@@ -2344,15 +2348,15 @@ init (xlator_t *this)
/* configure 'option window-size <size>' */
conf->window_size = WB_WINDOW_SIZE;
ret = dict_get_str (options, "cache-size",
- &window_size_string);
+ &str);
if (ret == 0) {
- ret = gf_string2bytesize (window_size_string,
+ ret = gf_string2bytesize (str,
&conf->window_size);
if (ret != 0) {
gf_log (this->name, GF_LOG_ERROR,
"invalid number format \"%s\" of \"option "
"window-size\"",
- window_size_string);
+ str);
FREE (conf);
return -1;
}
@@ -2378,9 +2382,9 @@ init (xlator_t *this)
/* configure 'option flush-behind <on/off>' */
conf->flush_behind = 0;
ret = dict_get_str (options, "flush-behind",
- &flush_behind_string);
+ &str);
if (ret == 0) {
- ret = gf_string2boolean (flush_behind_string,
+ ret = gf_string2boolean (str,
&conf->flush_behind);
if (ret == -1) {
gf_log (this->name, GF_LOG_ERROR,
@@ -2393,6 +2397,21 @@ init (xlator_t *this)
"enabling flush-behind");
}
}
+
+ conf->enable_trickling_writes = _gf_true;
+ ret = dict_get_str (options, "enable-trickling-writes",
+ &str);
+ if (ret == 0) {
+ ret = gf_string2boolean (str,
+ &conf->enable_trickling_writes);
+ if (ret == -1) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "'enable-trickling_writes' takes only boolean"
+ " arguments");
+ return -1;
+ }
+ }
+
this->private = conf;
return 0;
}