From 2f7f407e8eb4b529e964e1226574caecf4ea5820 Mon Sep 17 00:00:00 2001 From: Paul Rawson Date: Fri, 17 Apr 2009 00:29:48 -0700 Subject: [PATCH] Allow alu's min-free-disk to be specified as a percent or bytesize --- libglusterfs/src/xlator.c | 52 +++++++++++++++ libglusterfs/src/xlator.h | 8 ++- scheduler/alu/src/alu.c | 151 +++++++++------------------------------------ 3 files changed, 86 insertions(+), 125 deletions(-) diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 6af2c8e..5b5067a 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -431,6 +431,58 @@ _volume_option_value_validate (xlator_t *xl, ret = 0; } break; + case GF_OPTION_TYPE_PERCENTORSIZET: + { + uint32_t percent = 0; + uint32_t input_size = 0; + + /* Check if the value is valid percentage */ + if (gf_string2percent (pair->value->data, + &percent) == 0) { + if ((percent < 0) || (percent > 100)) { + gf_log (xl->name, GF_LOG_ERROR, + "'%d' in 'option %s %s' is out of " + "range [0 - 100]", + percent, pair->key, + pair->value->data); + } + ret = 0; + goto out; + } else { + /* Check the range */ + if (gf_string2bytesize (pair->value->data, + &input_size) == 0) { + + if ((opt->min == 0) && (opt->max == 0)) { + gf_log (xl->name, GF_LOG_DEBUG, + "no range check required for " + "'option %s %s'", + pair->key, pair->value->data); + ret = 0; + break; + } + if ((input_size < opt->min) || + (input_size > opt->max)) { + gf_log (xl->name, GF_LOG_ERROR, + "'%"PRId64"' in 'option %s %s' is " + "out of range [%"PRId64" - %"PRId64"]", + input_size, pair->key, + pair->value->data, + opt->min, opt->max); + } + ret = 0; + goto out; + } else { + // It's not a percent or size + gf_log (xl->name, GF_LOG_ERROR, + "invalid number format \"%s\" " + "in \"option %s\"", + pair->value->data, pair->key); + + } + } + } + break; case GF_OPTION_TYPE_TIME: { uint32_t input_time = 0; diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index 654e334..cf8d221 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -72,9 +72,10 @@ struct _loc { struct xlator_stats { uint64_t nr_files; /* Number of files open via this xlator */ - uint64_t free_disk; /* Mega bytes */ - uint64_t total_disk_size; /* Mega Bytes */ - uint64_t disk_usage; /* Mega bytes */ + uint64_t free_disk; /* Bytes or percent */ + uint64_t total_disk_size; /* Bytes or percent */ + uint64_t disk_usage; /* Bytes or percent */ + char disk_unit; /* 'p' or 'b' */ uint64_t disk_speed; /* MHz or Mbps */ uint64_t nr_clients; /* Number of client nodes */ uint64_t write_usage; @@ -807,6 +808,7 @@ typedef enum { GF_OPTION_TYPE_INT, GF_OPTION_TYPE_SIZET, GF_OPTION_TYPE_PERCENT, + GF_OPTION_TYPE_PERCENTORSIZET, GF_OPTION_TYPE_BOOL, GF_OPTION_TYPE_XLATOR, GF_OPTION_TYPE_PATH, diff --git a/scheduler/alu/src/alu.c b/scheduler/alu/src/alu.c index 571d06e..8939531 100644 --- a/scheduler/alu/src/alu.c +++ b/scheduler/alu/src/alu.c @@ -54,7 +54,11 @@ static int64_t get_stats_disk_usage (struct xlator_stats *this) { - return this->disk_usage; + if (this->disk_unit == 'p') { + return (this->disk_usage * 100) / this->total_disk_size; + } else { + return this->disk_usage; + } } static int64_t @@ -87,9 +91,13 @@ get_stats_file_usage (struct xlator_stats *this) static int64_t get_stats_free_disk (struct xlator_stats *this) { - if (this->total_disk_size > 0) - return (this->free_disk * 100) / this->total_disk_size; - return 0; + if (this->total_disk_size > 0) { + if (this->disk_unit == 'p') { + return (this->free_disk * 100) / this->total_disk_size; + } else { + return this->free_disk; + } + } } static int64_t @@ -154,15 +162,7 @@ alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched) dict_get (xl->options, "scheduler.alu.disk-usage.entry-threshold"); if (entry_fn) { - if (gf_string2bytesize (entry_fn->data, - &alu_sched->entry_limit.disk_usage) != 0) { - gf_log (xl->name, GF_LOG_ERROR, - "invalid number format \"%s\" " - "of \"option scheduler.alu." - "disk-usage.entry-threshold\"", - entry_fn->data); - return -1; - } + gf_string2bytesize (entry_fn->data, &alu_sched->entry_limit.disk_usage); } else { alu_sched->entry_limit.disk_usage = ALU_DISK_USAGE_ENTRY_THRESHOLD_DEFAULT; } @@ -170,14 +170,7 @@ alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched) exit_fn = dict_get (xl->options, "scheduler.alu.disk-usage.exit-threshold"); if (exit_fn) { - if (gf_string2bytesize (exit_fn->data, &alu_sched->exit_limit.disk_usage) != 0) { - gf_log (xl->name, GF_LOG_ERROR, - "invalid number format \"%s\" " - "of \"option scheduler.alu." - "disk-usage.exit-threshold\"", - exit_fn->data); - return -1; - } + gf_string2bytesize (exit_fn->data, &alu_sched->exit_limit.disk_usage); } else { alu_sched->exit_limit.disk_usage = ALU_DISK_USAGE_EXIT_THRESHOLD_DEFAULT; } @@ -206,15 +199,7 @@ alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched) entry_fn = dict_get (xl->options, "scheduler.alu.write-usage.entry-threshold"); if (entry_fn) { - if (gf_string2bytesize (entry_fn->data, - &alu_sched->entry_limit.write_usage) != 0) { - gf_log (xl->name, GF_LOG_ERROR, - "invalid number format \"%s\" " - "of option scheduler.alu." - "write-usage.entry-threshold", - entry_fn->data); - return -1; - } + gf_string2bytesize (entry_fn->data, &alu_sched->entry_limit.write_usage); } else { alu_sched->entry_limit.write_usage = ALU_WRITE_USAGE_ENTRY_THRESHOLD_DEFAULT; } @@ -222,15 +207,7 @@ alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched) exit_fn = dict_get (xl->options, "scheduler.alu.write-usage.exit-threshold"); if (exit_fn) { - if (gf_string2bytesize (exit_fn->data, - &alu_sched->exit_limit.write_usage) != 0) { - gf_log (xl->name, GF_LOG_ERROR, - "invalid number format \"%s\"" - " of \"option scheduler.alu." - "write-usage.exit-threshold\"", - exit_fn->data); - return -1; - } + gf_string2bytesize (exit_fn->data, &alu_sched->exit_limit.write_usage); } else { alu_sched->exit_limit.write_usage = ALU_WRITE_USAGE_EXIT_THRESHOLD_DEFAULT; } @@ -259,16 +236,7 @@ alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched) entry_fn = dict_get (xl->options, "scheduler.alu.read-usage.entry-threshold"); if (entry_fn) { - if (gf_string2bytesize (entry_fn->data, - &alu_sched->entry_limit.read_usage) != 0) { - gf_log (xl->name, - GF_LOG_ERROR, - "invalid number format \"%s\" " - "of \"option scheduler.alu." - "read-usage.entry-threshold\"", - entry_fn->data); - return -1; - } + gf_string2bytesize (entry_fn->data, &alu_sched->entry_limit.read_usage); } else { alu_sched->entry_limit.read_usage = ALU_READ_USAGE_ENTRY_THRESHOLD_DEFAULT; } @@ -277,16 +245,7 @@ alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched) "scheduler.alu.read-usage.exit-threshold"); if (exit_fn) { - if (gf_string2bytesize (exit_fn->data, - &alu_sched->exit_limit.read_usage) != 0) - { - gf_log ("alu", GF_LOG_ERROR, - "invalid number format \"%s\" " - "of \"option scheduler.alu." - "read-usage.exit-threshold\"", - exit_fn->data); - return -1; - } + gf_string2bytesize (exit_fn->data, &alu_sched->exit_limit.read_usage); } else { @@ -318,16 +277,7 @@ alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched) entry_fn = dict_get (xl->options, "scheduler.alu.open-files-usage.entry-threshold"); if (entry_fn) { - if (gf_string2uint64 (entry_fn->data, - &alu_sched->entry_limit.nr_files) != 0) - { - gf_log ("alu", GF_LOG_ERROR, - "invalid number format \"%s\" " - "of \"option scheduler.alu." - "open-files-usage.entry-" - "threshold\"", entry_fn->data); - return -1; - } + gf_string2uint64 (entry_fn->data, &alu_sched->entry_limit.nr_files); } else { @@ -338,16 +288,7 @@ alu_parse_options (xlator_t *xl, struct alu_sched *alu_sched) "scheduler.alu.open-files-usage.exit-threshold"); if (exit_fn) { - if (gf_string2uint64 (exit_fn->data, - &alu_sched->exit_limit.nr_files) != 0) - { - gf_log ("alu", GF_LOG_ERROR, - "invalid number format \"%s\" " - "of \"option scheduler.alu." - "open-files-usage.exit-" - "threshold\"", exit_fn->data); - return -1; - } + gf_string2uint64 (exit_fn->data, &alu_sched->exit_limit.nr_files); } else { @@ -443,24 +384,14 @@ alu_init (xlator_t *xl) _limit_fn->next = tmp_limits; alu_sched->limits_fn = _limit_fn; - if (gf_string2percent (limits->data, - &min_free_disk) != 0) { - gf_log ("alu", GF_LOG_ERROR, - "invalid number format \"%s\" " - "of \"option scheduler.limits." - "min-free-disk\"", limits->data); - return -1; + if (gf_string2percent (limits->data, &min_free_disk) == 0) { + alu_sched->spec_limit.disk_unit = 'p'; + } else { + alu_sched->spec_limit.disk_unit = 'b'; } + alu_sched->spec_limit.free_disk = min_free_disk; - if (alu_sched->spec_limit.free_disk >= 100) { - gf_log ("alu", GF_LOG_ERROR, - "check the \"option scheduler." - "limits.min-free-disk\", it should " - "be percentage value"); - return -1; - } - alu_sched->spec_limit.total_disk_size = ALU_LIMITS_TOTAL_DISK_SIZE_DEFAULT; /* Its in % */ gf_log ("alu", GF_LOG_DEBUG, "alu.limit.min-disk-free = %"PRId64"", _limit_fn->cur_value (&(alu_sched->spec_limit))); @@ -477,16 +408,7 @@ alu_init (xlator_t *xl) tmp_limits = alu_sched->limits_fn ; _limit_fn->next = tmp_limits; alu_sched->limits_fn = _limit_fn; - if (gf_string2uint64_base10 (limits->data, - &alu_sched->spec_limit.nr_files) != 0) - { - gf_log ("alu", GF_LOG_ERROR, - "invalid number format '%s' of option " - "scheduler.limits.max-open-files", - limits->data); - return -1; - } - + gf_string2uint64_base10 (limits->data, &alu_sched->spec_limit.nr_files); gf_log ("alu", GF_LOG_DEBUG, "alu_init: limit.max-open-files = %"PRId64"", _limit_fn->cur_value (&(alu_sched->spec_limit))); @@ -497,14 +419,7 @@ alu_init (xlator_t *xl) limits = dict_get (xl->options, "scheduler.refresh-interval"); if (limits) { - if (gf_string2time (limits->data, - &alu_sched->refresh_interval) != 0) { - gf_log ("alu", GF_LOG_ERROR, - "invalid number format \"%s\" of " - "option scheduler.refresh-interval", - limits->data); - return -1; - } + gf_string2time (limits->data, &alu_sched->refresh_interval); } else { alu_sched->refresh_interval = ALU_REFRESH_INTERVAL_DEFAULT; } @@ -514,15 +429,7 @@ alu_init (xlator_t *xl) limits = dict_get (xl->options, "scheduler.alu.stat-refresh.num-file-create"); if (limits) { - if (gf_string2uint32 (limits->data, - &alu_sched->refresh_create_count) != 0) - { - gf_log ("alu", GF_LOG_ERROR, - "invalid number format \"%s\" of \"option " - "alu.stat-refresh.num-file-create\"", - limits->data); - return -1; - } + gf_string2uint32 (limits->data, &alu_sched->refresh_create_count); } else { alu_sched->refresh_create_count = ALU_REFRESH_CREATE_COUNT_DEFAULT; } @@ -983,7 +890,7 @@ struct volume_options options[] = { }, { .key = { "scheduler.limits.min-free-disk", "alu.limits.min-free-disk" }, - .type = GF_OPTION_TYPE_PERCENT + .type = GF_OPTION_TYPE_PERCENTORSIZET }, { .key = { "scheduler.alu.stat-refresh.num-file-create" "alu.stat-refresh.num-file-create"}, -- 1.6.0.6