[Gluster-devel] [PATCH] Add support for min-free-disk in dht and the new nufa as a valid glusterfs size as well as percent.
Amar Tumballi
amar at zresearch.com
Tue Apr 28 18:42:15 UTC 2009
Patch is logically fine. Avati, you can push it, once you check it compiles
without errors.
Regards,
Amar
On Mon, Apr 27, 2009 at 10:53 AM, Paul Rawson <plrca2 at gmail.com> wrote:
> Ok, this one should be good. I've removed the changes to alu since
> that seems to be depreciated.
> -Paul
>
> ---
> libglusterfs/src/xlator.c | 84
> +++++++++++++++++++++++++++++++
> libglusterfs/src/xlator.h | 1 +
> xlators/cluster/dht/src/dht-common.h | 3 +-
> xlators/cluster/dht/src/dht-diskusage.c | 47 +++++++++++++----
> xlators/cluster/dht/src/dht.c | 50 ++++++++++++-------
> xlators/cluster/dht/src/nufa.c | 36 ++++++++++----
> 6 files changed, 180 insertions(+), 41 deletions(-)
>
> diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
> index 6af2c8e..bf6252a 100644
> --- a/libglusterfs/src/xlator.c
> +++ b/libglusterfs/src/xlator.c
> @@ -431,6 +431,90 @@ _volume_option_value_validate (xlator_t *xl,
> ret = 0;
> }
> break;
> + case GF_OPTION_TYPE_PERCENTORSIZET:
> + {
> + uint32_t percent = 0;
> + uint64_t input_size = 0;
> +
> + /* Check if the value is valid percentage */
> + if (gf_string2percent (pair->value->data,
> + &percent) == 0) {
> + if (percent > 100) {
> + gf_log (xl->name, GF_LOG_DEBUG,
> + "value given was greater than 100,
> "
> + "assuming this is actually a
> size");
> + if (gf_string2bytesize (pair->value->data,
> + &input_size) == 0)
> {
> + /* Check the range */
> + 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);
> + // It is a size
> + ret = 0;
> + goto out;
> + }
> + 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);
> + }
> + // It is a size
> + 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);
> + }
> +
> + }
> + // It is a percent
> + ret = 0;
> + goto out;
> + } else {
> + if (gf_string2bytesize (pair->value->data,
> + &input_size) == 0) {
> + /* Check the range */
> + 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);
> + // It is a size
> + ret = 0;
> + goto out;
> + }
> + 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);
> + }
> + } 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);
> + }
> + //It is a size
> + ret = 0;
> + goto out;
> + }
> +
> + }
> + 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..bba074e 100644
> --- a/libglusterfs/src/xlator.h
> +++ b/libglusterfs/src/xlator.h
> @@ -807,6 +807,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/xlators/cluster/dht/src/dht-common.h
> b/xlators/cluster/dht/src/dht-common.h
> index 63a8bb2..1c2b6f4 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;
> gf_boolean_t unhashed_sticky_bit;
> 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..7edf4d0 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;
> @@ -56,8 +57,15 @@ dht_du_info_cbk (call_frame_t *frame, void *cookie,
> xlator_t *this,
> 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 +182,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 +207,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 +222,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 +232,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 4dac730..4658e59 100644
> --- a/xlators/cluster/dht/src/dht.c
> +++ b/xlators/cluster/dht/src/dht.c
> @@ -81,9 +81,10 @@ 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;
> + uint32_t temp_free_disk = 0;
>
> if (!this->children) {
> gf_log (this->name, GF_LOG_ERROR,
> @@ -106,27 +107,40 @@ 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->unhashed_sticky_bit = 0;
> + conf->unhashed_sticky_bit = 0;
>
> - if (dict_get_str (this->options, "unhashed-sticky-bit",
> - &lookup_unhashed_str) == 0) {
> - gf_string2boolean (lookup_unhashed_str,
> - &conf->unhashed_sticky_bit);
> + if (dict_get_str (this->options, "unhashed-sticky-bit",
> + &temp_str) == 0) {
> + gf_string2boolean (temp_str,
> + &conf->unhashed_sticky_bit);
> }
>
> conf->min_free_disk = 10;
> -
> - if (dict_get_str (this->options, "min-free-disk",
> - &lookup_unhashed_str) == 0) {
> - gf_string2percent (lookup_unhashed_str,
> - &conf->min_free_disk);
> - }
> -
> + conf->disk_unit = 'p';
> +
> + if (dict_get_str (this->options, "min-free-disk",
> + &temp_str) == 0) {
> + if (gf_string2percent (temp_str,
> + &temp_free_disk) == 0) {
> + if (temp_free_disk > 100) {
> + gf_string2bytesize (temp_str,
> +
> &conf->min_free_disk);
> + conf->disk_unit = 'b';
> + } else {
> + conf->min_free_disk =
> (uint64_t)temp_free_disk;
> + conf->disk_unit = 'p';
> + }
> + } else {
> + gf_string2bytesize (temp_str,
> + &conf->min_free_disk);
> + conf->disk_unit = 'b';
> + }
> + }
>
> ret = dht_init_subvolumes (this, conf);
> if (ret == -1) {
> @@ -242,11 +256,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..128ff77 100644
> --- a/xlators/cluster/dht/src/nufa.c
> +++ b/xlators/cluster/dht/src/nufa.c
> @@ -527,10 +527,11 @@ 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];
> + uint32_t temp_free_disk = 0;
>
> if (!this->children) {
> gf_log (this->name, GF_LOG_ERROR,
> @@ -553,9 +554,9 @@ 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,
> - &conf->search_unhashed);
> + &temp_str) == 0) {
> + gf_string2boolean (temp_str,
> + &conf->search_unhashed);
> }
>
> ret = dht_init_subvolumes (this, conf);
> @@ -607,11 +608,26 @@ init (xlator_t *this)
> conf->local_volume = trav->xlator;
>
> conf->min_free_disk = 10;
> -
> - data = dict_get (this->options, "min-free-disk");
> - if (data) {
> - gf_string2percent (data->data, &conf->min_free_disk);
> - }
> + conf->disk_unit = 'p';
> +
> + if (dict_get_str (this->options, "min-free-disk",
> + &temp_str) == 0) {
> + if (gf_string2percent (temp_str,
> + &temp_free_disk) == 0) {
> + if (temp_free_disk > 100) {
> + gf_string2bytesize (temp_str,
> +
> &conf->min_free_disk);
> + conf->disk_unit = 'b';
> + } else {
> + conf->min_free_disk =
> (uint64_t)temp_free_disk;
> + conf->disk_unit = 'p';
> + }
> + } else {
> + gf_string2bytesize (temp_str,
> + &conf->min_free_disk);
> + conf->disk_unit = 'b';
> + }
> + }
>
> conf->du_stats = CALLOC (conf->subvolume_cnt, sizeof (dht_du_t));
> if (!conf->du_stats) {
> @@ -720,7 +736,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
>
>
> _______________________________________________
> Gluster-devel mailing list
> Gluster-devel at nongnu.org
> http://lists.nongnu.org/mailman/listinfo/gluster-devel
>
--
Amar Tumballi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://supercolony.gluster.org/pipermail/gluster-devel/attachments/20090428/8aaa8c65/attachment-0003.html>
More information about the Gluster-devel
mailing list