>From e533f88b1ff4870cb9dda7d12a185ff39c4f87af Mon Sep 17 00:00:00 2001 From: Paul Rawson <plrca2@xxxxxxxxx> Date: Tue, 21 Apr 2009 23:54:31 -0700 Subject: [PATCH] Patch to allow min-free-disk for dht and the new nufa to be specified as a percent or a valid glusterfs size (KB,MB,GB,TB,PB). --- libglusterfs/src/xlator.c | 2 +- scheduler/alu/src/alu.c | 8 +++-- xlators/cluster/dht/src/dht-common.h | 3 +- xlators/cluster/dht/src/dht-diskusage.c | 48 +++++++++++++++++++++++-------- xlators/cluster/dht/src/dht.c | 24 +++++++++------ xlators/cluster/dht/src/nufa.c | 24 ++++++++++----- 6 files changed, 75 insertions(+), 34 deletions(-) diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 5b5067a..0345037 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -434,7 +434,7 @@ _volume_option_value_validate (xlator_t *xl, case GF_OPTION_TYPE_PERCENTORSIZET: { uint32_t percent = 0; - uint32_t input_size = 0; + input_size = 0; /* Check if the value is valid percentage */ if (gf_string2percent (pair->value->data, diff --git a/scheduler/alu/src/alu.c b/scheduler/alu/src/alu.c index 8939531..967eece 100644 --- a/scheduler/alu/src/alu.c +++ b/scheduler/alu/src/alu.c @@ -98,6 +98,7 @@ get_stats_free_disk (struct xlator_stats *this) return this->free_disk; } } + return 0; } static int64_t @@ -384,10 +385,11 @@ 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) { - alu_sched->spec_limit.disk_unit = 'p'; - } else { + if (gf_string2bytesize (limits->data, &min_free_disk)) { alu_sched->spec_limit.disk_unit = 'b'; + } else { + gf_string2percent (limits->data, &min_free_disk); + alu_sched->spec_limit.disk_unit = 'p'; } alu_sched->spec_limit.free_disk = min_free_disk; diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 6d78479..06d79ca 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -117,7 +117,8 @@ struct dht_conf { gf_boolean_t search_unhashed; int gen; dht_du_t *du_stats; - uint32_t min_free_disk; + uint64_t min_free_disk; + char disk_unit; int32_t refresh_interval; struct timeval last_stat_fetch; }; diff --git a/xlators/cluster/dht/src/dht-diskusage.c b/xlators/cluster/dht/src/dht-diskusage.c index 5e3dc23..a809380 100644 --- a/xlators/cluster/dht/src/dht-diskusage.c +++ b/xlators/cluster/dht/src/dht-diskusage.c @@ -43,6 +43,7 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int this_call_cnt = 0; int i = 0; double percent = 0; + uint64_t bytes = 0; local = frame->local; conf = this->private; @@ -52,12 +53,20 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto out; percent = (statvfs->f_bfree * 100) / statvfs->f_blocks; + bytes = (statvfs->f_bfree) * (statvfs->f_bsize); LOCK (&conf->subvolume_lock); { for (i = 0; i < conf->subvolume_cnt; i++) - if (prev->this == conf->subvolumes[i]) + if (prev->this == conf->subvolumes[i]){ conf->du_stats[i].avail_percent = percent; + conf->du_stats[i].avail_space = bytes; + gf_log (this->name, GF_LOG_DEBUG, + "avail_percent on %d is: %f, " + "and avail_space on %d is: %llu", + i, conf->du_stats[i].avail_percent, + i, conf->du_stats[i].avail_space); + } } UNLOCK (&conf->subvolume_lock); @@ -174,15 +183,24 @@ dht_is_subvol_filled (xlator_t *this, xlator_t *subvol) conf = this->private; - /* Check for values above 90% free disk */ + /* Check for values above specified percent or free disk */ LOCK (&conf->subvolume_lock); { for (i = 0; i < conf->subvolume_cnt; i++) { - if ((subvol == conf->subvolumes[i]) && - (conf->du_stats[i].avail_percent < - conf->min_free_disk)) { - subvol_filled = 1; - break; + if (subvol == conf->subvolumes[i]) { + if (conf->disk_unit == 'p') { + if (conf->du_stats[i].avail_percent < + conf->min_free_disk) { + subvol_filled = 1; + break; + } + } else { + if (conf->du_stats[i].avail_space < + conf->min_free_disk) { + subvol_filled = 1; + break; + } + } } } } @@ -190,7 +208,7 @@ dht_is_subvol_filled (xlator_t *this, xlator_t *subvol) if (subvol_filled) { if (!(conf->du_stats[i].log++ % GF_UNIVERSAL_ANSWER)) { - gf_log (this->name, GF_LOG_CRITICAL, + gf_log (this->name, GF_LOG_WARNING, "disk space on subvolume '%s' is getting " "full (%.2f %%), consider adding more nodes", subvol->name, @@ -205,7 +223,7 @@ xlator_t * dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol) { int i = 0; - double max_avail = 0; + uint64_t max_avail = 0; xlator_t *avail_subvol = NULL; dht_conf_t *conf = NULL; @@ -215,10 +233,16 @@ dht_free_disk_available_subvol (xlator_t *this, xlator_t *subvol) LOCK (&conf->subvolume_lock); { for (i = 0; i < conf->subvolume_cnt; i++) { - if (conf->du_stats[i].avail_percent > max_avail) { - max_avail = conf->du_stats[i].avail_percent; + if (conf->disk_unit == 'p') { + if (conf->du_stats[i].avail_percent > max_avail) { + max_avail = conf->du_stats[i].avail_percent; + } avail_subvol = conf->subvolumes[i]; - } + } else { + if (conf->du_stats[i].avail_space > max_avail) { + max_avail = conf->du_stats[i].avail_space; + } + } } } UNLOCK (&conf->subvolume_lock); diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c index ddf9583..7e65d6b 100644 --- a/xlators/cluster/dht/src/dht.c +++ b/xlators/cluster/dht/src/dht.c @@ -81,7 +81,7 @@ int init (xlator_t *this) { dht_conf_t *conf = NULL; - char *lookup_unhashed_str = NULL; + char *temp_str = NULL; int ret = -1; int i = 0; @@ -106,17 +106,23 @@ init (xlator_t *this) conf->search_unhashed = 0; if (dict_get_str (this->options, "lookup-unhashed", - &lookup_unhashed_str) == 0) { - gf_string2boolean (lookup_unhashed_str, + &temp_str) == 0) { + gf_string2boolean (temp_str, &conf->search_unhashed); } conf->min_free_disk = 10; + conf->disk_unit = 'p'; if (dict_get_str (this->options, "min-free-disk", - &lookup_unhashed_str) == 0) { - gf_string2percent (lookup_unhashed_str, - &conf->min_free_disk); + &temp_str) == 0) { + if (!gf_string2bytesize (temp_str, + &conf->min_free_disk)) { + conf->disk_unit = 'b'; + } else { + gf_string2percent (temp_str, &conf->min_free_disk); + conf->disk_unit = 'p'; + } } @@ -234,11 +240,11 @@ struct xlator_cbks cbks = { struct volume_options options[] = { + { .key = {"min-free-disk"}, + .type = GF_OPTION_TYPE_PERCENTORSIZET + }, { .key = {"lookup-unhashed"}, .type = GF_OPTION_TYPE_BOOL }, - { .key = {"min-free-disk"}, - .type = GF_OPTION_TYPE_PERCENT - }, { .key = {NULL} }, }; diff --git a/xlators/cluster/dht/src/nufa.c b/xlators/cluster/dht/src/nufa.c index 57ac6b0..eb84479 100644 --- a/xlators/cluster/dht/src/nufa.c +++ b/xlators/cluster/dht/src/nufa.c @@ -527,7 +527,7 @@ init (xlator_t *this) xlator_list_t *trav = NULL; data_t *data = NULL; char *local_volname = NULL; - char *lookup_unhashed_str = NULL; + char *temp_str = NULL; int ret = -1; int i = 0; char my_hostname[256]; @@ -553,8 +553,8 @@ init (xlator_t *this) conf->search_unhashed = 0; if (dict_get_str (this->options, "lookup-unhashed", - &lookup_unhashed_str) == 0) { - gf_string2boolean (lookup_unhashed_str, + &temp_str) == 0) { + gf_string2boolean (temp_str, &conf->search_unhashed); } @@ -607,11 +607,19 @@ init (xlator_t *this) conf->local_volume = trav->xlator; conf->min_free_disk = 10; + conf->disk_unit = 'p'; + + if (dict_get_str (this->options, "min-free-disk", + &temp_str) == 0) { + if (!gf_string2bytesize (temp_str, + &conf->min_free_disk)) { + conf->disk_unit = 'b'; + } else { + gf_string2percent (temp_str, &conf->min_free_disk); + conf->disk_unit = 'p'; + } + } - data = dict_get (this->options, "min-free-disk"); - if (data) { - gf_string2percent (data->data, &conf->min_free_disk); - } conf->du_stats = CALLOC (conf->subvolume_cnt, sizeof (dht_du_t)); if (!conf->du_stats) { @@ -720,7 +728,7 @@ struct volume_options options[] = { .type = GF_OPTION_TYPE_BOOL }, { .key = {"min-free-disk"}, - .type = GF_OPTION_TYPE_PERCENT + .type = GF_OPTION_TYPE_PERCENTORSIZET }, { .key = {NULL} }, }; -- 1.6.0.6